2011-05-05 2 views
2

Я немного запутался в поведении тестов rpsec, связанных с методами контроллера, которые влияют на БД. Я видел много примеров тестов rspec, которые включают POST и DELETE, где люди проверяют, что объект был создан или удален. В большинстве из этих испытаний люди могут просто проверить, что граф модели в БД увеличилась или уменьшенная с тестами, такими как:Действия 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) 

Синтаксис не является совершенным в последнем примере, но я хочу сказать, что по моему опыту мне нужно было вызвать перезагрузку объекта, чтобы пройти любой из этих тестов, но по какой-то причине другие могут заставить их работать без явно вызов перезагрузки. Что-то о вызове reload каждый раз, когда я тестирую действие db create/destroy, кажется мне подозрительным.

Может ли кто-нибудь помочь мне понять, что происходит? Благодаря!

ACTUAL CODE UPDATE

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: 

Если я перезагрузить @album перед вызовом PHOTO_COUNT, хотя, это работает.

+0

Можете ли вы привести пример неисправного кода, с которым вы столкнулись? Вам не нужно вызывать перезагрузку, если вы не сохранили результат перед выполнением запроса. – nmunson

+0

Код, который вы дали, по-видимому, ведет себя так, как вам нужно, поскольку ваше утверждение относится к переменной, заданной перед запросом. Возможно, вы могли бы дать какой-то фактический код, который вы видели, который не вызывает перезагрузку. – monocle

+0

Я отправил фактический код, который терпит неудачу. Дайте мне знать, если вам нужно что-то еще! – Danny

ответ

4

Я хотел бы указать, что тестирование состояния модели в спецификации контроллера не является очень хорошей практикой, поскольку оно нарушает изоляцию единичного теста. Вместо этого вы должны проверить, подходит ли ответ контроллера для текущего сценария.

Смежные вопросы