Я немного запутался с поведением тестов 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, это сработает.