同じスペックコンテキストで複数のgetを実行する必要がある場合、コントローラースペックに各getの前にインスタンス変数スペースを「リセット」する方法はありますか?
テストごとに1つのアサーションのガイドラインを理解しています。ただし、一連のテストの1つでは、各getの前に個別の(長い)before(:each)セットアップを実行せず、単一のコンテキストで一連のget / assertを一緒に実行すると、約3倍高速に実行されます。 。
ただし、(ブラウザを介してコントローラメソッドが呼び出される場合とは異なり)rspecを使用して2つの連続したgetを実行すると、各getでインスタンス変数がクリアされないため、データのクロスオーバーが発生する可能性があります。
これは失敗したテストであり、別のコントローラーメソッド「vartest2」が実行されたときに「vartest1」に設定された変数がまだ存在していることを示しています。
コントローラのメソッド:
def vartest1
@this_var = "foo"
render :text => @this_var
end
def vartest2
render :text => @this_var # should be EMPTY!
end
Rspecコントローラーの仕様:
describe "instance variable crossover example", :focus => true do
describe "THIS PASSES put each get in separate contexts" do
it "vartest1 outputs foo" do
get "vartest1"
response.body.should include("foo")
end
it "vartest2 does NOT output foo" do
get "vartest2"
response.body.should_not include("foo")
end
end
describe "THIS FAILS put both gets in SAME context" do
it "should not crossover controller instance varables" do
get "vartest1"
response.body.should include("foo")
get "vartest2"
response.body.should_not include("foo") # THIS FAILS
end
end
end
Rspecの結果:
instance variable crossover example
THIS PASSES put each get in separate contexts
vartest1 outputs foo
vartest2 does NOT output foo
THIS FAILS put both gets in SAME context
should not crossover controller instance varables (FAILED - 1)
失敗したテストで起こっていることは、rspecがget 'vartest1'
コントローラーメソッドを実行するとインスタンス変数を'foo'に設定し、rspecが実行get 'vartest2'
するとインスタンス変数(nilである必要があります)がまだ設定されているため、テストが失敗することです。