混淆在RSpec测试中如何评估变量

时间:2018-07-23 16:35:05

标签: ruby-on-rails rspec

我正在测试delete请求规范中的hour动作。这些请求集嵌套在父restaurant下。因此,我为父级保存了一个全局变量。在我进行的任何测试中,都可以引用该父级。

对于我的删除请求,我显然必须提供一个小时。奇怪的是,只有在我使用let!(:hour) {...}let(:hour) {...}的情况下,测试才通过。我意识到带有let的{​​{1}}不再懒惰地加载并在每个测试中触发。与我想要的相反。为什么在下面的测试中使用!而不使用restaurant没问题?

hour

1 个答案:

答案 0 :(得分:1)

  

为什么使用restaurant而不是hour进行下面的测试没有问题?

存在相同的“问题”。它只是对您不可见,因为您对此没有任何检查。试试这个,例如:

expect { ... }.to_not change(Restaurant, :count) 

change期望记下初始值的时刻,运行操作之前,这些记录都不存在。 Hour.count将为0,因为尚未评估hour。餐厅也一样。

因此,使用let!或确保在设置期望之前评估记录。像这样:

it "destroys the requested hour" do
  restaurant; hour # poor man's let!
  expect {
    delete admin_restaurant_hour_path(restaurant, hour)
  }.to change(Hour, :count).by(-1)
end