2011-05-05 72 views
2

我對涉及影響數據庫的控制器方法的rpsec測試的行爲有點困惑。我見過很多涉及POST和DELETE的rspec測試的例子,人們檢查是否已經創建或刪除了一個對象。在大多數這些試驗的人都能夠只檢查在數據庫模型的數量增加或與測試,如descreased:更改DB的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才能讓這些測試通過,但由於某些原因,其他人可以在不明確的情況下工作調用重新加載。每次我測試數據庫創建/銷燬操作時,關於調用重新加載的事情對我來說似乎都很詭異。

任何人都可以幫助我理解發生了什麼?謝謝!

實際代碼更新

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,它的工作原理。

+0

你可以舉一個你遇到問題的失敗代碼的例子嗎?除非在執行請求之前保存了結果,否則不需要調用重新加載。 – nmunson 2011-05-05 03:40:36

+0

您給出的代碼看起來應該像它應該的那樣行爲,因爲您的斷言位於您在請求之前設置的變量上。也許你可以提供一些你看過的並沒有調用重載的實際代碼。 – monocle 2011-05-05 04:00:46

+0

我發佈了失敗的實際代碼。讓我知道如果你需要別的東西! – Danny 2011-05-05 04:01:40

回答

4

我想指出,在控制器規範中測試模型狀態並不是一個很好的做法,因爲它違反了單元測試的隔離。您應該測試一下控制器響應是否適合當前的情況。