我对涉及影响数据库的控制器方法的 rpsec 测试的行为有点困惑。我见过许多涉及 POST 和 DELETE 的 rspec 测试示例,人们在其中检查对象是否已创建或删除。在大多数这些测试中,人们可以通过以下测试来检查数据库中模型的数量是否增加或减少:
delete :clear_photos, :id => @album.id
@album.photos.size.should == 0
或使用 lambda:
lambda {delete :destroy, :id => @photo.id}.should change(@album.photos, :size).by(-1)
最后一个示例中的语法并不完美,但我的观点是,根据我的经验,我需要在对象上调用 reload 以使这些测试中的任何一个通过,但由于某种原因,其他测试能够使它们工作无需显式调用重新加载。每次我测试数据库创建/销毁操作时调用 reload 的事情对我来说似乎很可疑。
谁能帮我理解发生了什么?谢谢!
实际代码更新
it "should clear all photos for an album" do
@album = Factory(:album, :photos => [Factory(:photo), Factory(:photo)])
delete :clear, :album_id => @album.id
@album.photo_count.should == 0
end
我得到这个回应:
'PhotosController#clear should clear all photos for an album' FAILED
expected: 0,
got: 2 (using ==)
./spec/controllers/photos_controller_spec.rb:17:
如果我在调用 photo_count 之前重新加载@album,它会起作用。