2

我对涉及影响数据库的控制器方法的 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,它会起作用。

4

1 回答 1

5

我想指出,在控制器规范中测试模型状态并不是一个很好的做法,因为它违反了单元测试的隔离性。相反,您应该测试控制器响应是否适合当前场景。

于 2011-05-08T05:25:00.107 回答