我正在测试delete
请求规范中的hour
动作。这些请求集嵌套在父restaurant
下。因此,我为父级保存了一个全局变量。在我进行的任何测试中,都可以引用该父级。
对于我的删除请求,我显然必须提供一个小时。奇怪的是,只有在我使用let!(:hour) {...}
与let(:hour) {...}
的情况下,测试才通过。我意识到带有let
的{{1}}不再懒惰地加载并在每个测试中触发。与我想要的相反。为什么在下面的测试中使用!
而不使用restaurant
没问题?
hour
答案 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