更改数据库的Rspec操作

Dan*_*nny 2 ruby rspec ruby-on-rails rr

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

delete :clear_photos, :id => @album.id
@album.photos.size.should == 0 
Run Code Online (Sandbox Code Playgroud)

或与lambdas:

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

在最后一个例子中语法并不完美,但我的观点是,根据我的经验,我需要在对象上调用reload才能通过任何这些测试,但出于某种原因,其他人能够使它们工作没有显式调用重载.每次我测试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
Run Code Online (Sandbox Code Playgroud)

我收到了这个回复:

'PhotosController#clear should clear all photos for an album' FAILED
expected: 0,
     got: 2 (using ==)
./spec/controllers/photos_controller_spec.rb:17:
Run Code Online (Sandbox Code Playgroud)

如果我在调用photo_count之前重新加载@album,它会起作用.

sni*_*tko 5

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