如果我们必须在同一规范上下文中进行多次获取,控制器规范中是否有任何方法可以在每次获取之前“重置”实例变量空间?
我理解每次测试一个断言的指南。但是,对于我们的一组测试,如果我们在每次获取之前不进行单独的(冗长的)before(:each) 设置,并且如果我们在单个上下文中一起运行一系列获取/断言,它的运行速度将提高大约 3 倍.
但是,似乎(与通过浏览器调用控制器方法时不同)如果您使用 rspec 执行两个连续的 get,则每次 get 都不会清除实例变量,因此数据交叉是可能的。
这是一个失败的测试,表明当另一个控制器方法“vartest2”运行时,“vartest1”中设置的变量仍然存在:
控制器方法:
def vartest1
@this_var = "foo"
render :text => @this_var
end
def vartest2
render :text => @this_var # should be EMPTY!
end
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
失败测试中发生的情况是,当 rspecget 'vartest1'控制器方法将实例变量设置为 'foo' 时,并且当 rspec 执行时get 'vartest2',实例变量(应该为零)仍然设置,因此测试失败。
控制器规格是单元测试。与所有单元测试一样,它们应该单独测试方法。对于控制器来说,这意味着每个操作都需要自己的规范。在控制器规范中执行多个请求不太可能有任何效果。
您可以考虑使用请求规范或 Cucumber。根据您的环境,这可能会给您带来更好的结果,因为每个示例只需进行一次设置。然后你可以做多个gets(或visits)。
另一种可能性是针对您的控制器规格使用模拟/存根。这可以显着提高性能,但代价是进行额外的设置。控制器规范的 RSpec 支架示例是这种方法的一个很好的起点。
| 归档时间: |
|
| 查看次数: |
1070 次 |
| 最近记录: |