Действия Rspec, которые изменяют БД - PullRequest
2 голосов
/ 05 мая 2011

Я немного запутался с поведением тестов rpsec с использованием методов контроллера, которые влияют на БД. Я видел много примеров тестов rspec, которые включают POST и DELETE, где люди проверяют, был ли объект создан или удален. В большинстве этих тестов люди могут просто проверить, увеличилось или уменьшилось количество модели в БД с помощью таких тестов, как:

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 для объекта, чтобы выполнить любой из этих тестов, но по какой-то причине другие способны заставить их работать без явного вызова перезагрузки. Что-то в вызове 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:

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

1 Ответ

5 голосов
/ 08 мая 2011

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

...