Я немного запутался в поведении тестов 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, хотя, это работает.
Можете ли вы привести пример неисправного кода, с которым вы столкнулись? Вам не нужно вызывать перезагрузку, если вы не сохранили результат перед выполнением запроса. – nmunson
Код, который вы дали, по-видимому, ведет себя так, как вам нужно, поскольку ваше утверждение относится к переменной, заданной перед запросом. Возможно, вы могли бы дать какой-то фактический код, который вы видели, который не вызывает перезагрузку. – monocle
Я отправил фактический код, который терпит неудачу. Дайте мне знать, если вам нужно что-то еще! – Danny