2011-05-05 3 views
2

DB에 영향을주는 컨트롤러 메서드와 관련된 rpsec 테스트의 동작과 약간 혼동합니다. POST 및 DELETE와 관련된 rspec 테스트의 많은 예제를 통해 사람들이 오브젝트가 작성 또는 삭제되었음을 확인하는 것을 확인했습니다.DB를 변경하는 Rspec 작업

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

또는 람다와 :

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

구문이 테스트의 대부분의 사람들은 그냥 DB에서 모델의 수는 같은 테스트를 증가 또는 descreased 것을 확인 할 수있다 마지막 예제에서 완벽하지는 않지만 내 경험상 이러한 테스트를 통과하려면 객체를 다시로드해야하지만 어떤 이유 때문에 명시 적으로 작동하지 않게 할 수있는 점이 있습니다. reload를 호출합니다. db 생성/파괴 작업을 테스트 할 때마다 재로드를 호출하는 것에 대해 나에게 비린내가 보인다.

아무도 나에게 무슨 일이 일어나는지 이해하도록 도와 줄 수 있습니까? 감사! 그래도 난 PHOTO_COUNT를 호출하기 전에 @album를 다시로드하면

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

, 그것은 작동합니다

실제 코드 업데이트

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 

나는이 응답을 얻을.

+0

문제가있는 코드 오류의 예를 들려 줄 수 있습니까? 요청을 수행하기 전에 결과를 저장하지 않으면 재로드를 호출 할 필요가 없습니다. – nmunson

+0

요청한 코드는 요청 전에 설정 한 변수에 어설 션이 있기 때문에 행동해야합니다. 어쩌면 다시로드를 호출하지 않는 것을 본 적이있는 실제 코드를 제공 할 수 있습니다. – monocle

+0

실패한 실제 코드를 게시했습니다. 니가 다른 것을 필요로하면 나에게 알려줘! – Danny

답변

4

컨트롤러 사양에서 모델 상태를 테스트하는 것은 단위 테스트의 격리를 위반하기 때문에 아주 좋은 방법은 아니라는 점을 지적하고자합니다. 대신 컨트롤러 응답이 현재 시나리오에 적합한 지 테스트해야합니다.