2

DBに影響を与えるコントローラーメソッドを含むrpsecテストの動作と少し混乱しています。私は、POSTとDELETEを含むrspecテストの多くの例を見てきました。そこでは、オブジェクトが作成または削除されたことを確認します。これらのテストのほとんどでは、次のようなテストを使用して、DB内のモデルの数が増加または減少したことを確認できます。

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

またはラムダを使用:

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

最後の例では構文は完全ではありませんが、私の経験では、これらのテストのいずれかに合格するには、オブジェクトに対してreloadを呼び出す必要がありましたが、何らかの理由で、他のテストでそれらを機能させることができます。明示的にリロードを呼び出さずに。db create / destroyアクションをテストするたびに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 に答える