更改数据库的Rspec操作

时间:2011-05-05 03:19:23

标签: ruby-on-rails ruby rspec rr

我对涉及影响DB的控制器方法的rpsec测试的行为有点困惑。我见过很多涉及POST和DELETE的rspec测试示例,人们检查是否创建或删除了对象。在大多数测试中,人们只需通过以下测试检查数据库中模型的计数是增加还是减少:

delete :clear_photos, :id => @album.id
@album.photos.size.should == 0 

或与lambdas:

lambda {delete :destroy, :id => @photo.id}.should change(@album.photos, :size).by(-1)

在上一个例子中语法并不完美,但我的观点是,根据我的经验,我需要调用对象的重载以便通过任何这些测试,但由于某种原因,其他人能够使它们工作而不显式调用重载。每当我测试db create / destroy动作时调用重载的东西对我来说都是可疑的。

任何人都可以帮我理解发生了什么吗?谢谢!

实际代码更新

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,它可以正常工作。

1 个答案:

答案 0 :(得分:5)

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