如果我们必须在同一个规范上下文中进行多次获取,控制器规范中是否有任何方法可以在每次获取之前“重置”实例变量空间?
我理解每个测试一个断言的指导方针。但是,对于我们的一组测试,如果我们在每次获取之前不进行单独的(冗长的) before(:each) 设置并且如果我们在单个上下文中一起运行一系列获取/断言,它的运行速度大约会快 3 倍.
但是,似乎(与通过浏览器调用控制器方法不同)如果您使用 rspec 执行两次连续获取,则每次获取都不会清除实例变量,因此数据交叉是可能的。
这是一个失败的测试,表明当另一个控制器方法 '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)
失败测试中发生的情况是,当 rspecget 'vartest1'
控制器方法将实例变量设置为“foo”时,当 rspec 执行时get 'vartest2'
,实例变量(应该为 nil)仍然设置,因此测试失败。