пусть функционален как его по сути Proc.Также его кешируется.
Одна ошибка, которую я сразу нашел с помощью let ... В блоке Spec, который оценивает изменение.
let(:object) {FactoryGirl.create :object}
expect {
post :destroy, id: review.id
}.to change(Object, :count).by(-1)
Вам нужно будет обязательно позвонить let
за пределы ожидаемого блока.то есть вы звоните FactoryGirl.create
в свой блок let.Я обычно делаю это, проверяя объект сохраняется.
object.persisted?.should eq true
В противном случае, когда блок let
вызывается в первый раз, изменение базы данных фактически произойдет из-за отложенного создания экземпляра.
Обновление
Просто добавляю заметку.Будьте осторожны, играя code golf или в этом случае rspec golf с этим ответом.
В этом случае мне просто нужно вызвать метод, на который реагирует объект.Поэтому я вызываю метод _.persisted?
_ для объекта как истинный.Все, что я пытаюсь сделать, это создать экземпляр объекта.Вы могли бы назвать пустым?или ноль?тоже.Дело не в тесте, а в том, чтобы оживить объект, вызвав его.
Таким образом, вы не можете рефакторировать
object.persisted?.should eq true
, чтобы быть
object.should be_persisted
, поскольку объект не был создан ... его ленивый.:)
Обновление 2
рычаг let!синтаксис для мгновенного создания объекта, что должно полностью избежать этой проблемы.Заметьте, что хотя это и побьет многие из лени не грохнувшего let.
Также в некоторых случаях вам может потребоваться использовать субъектный синтаксис вместо let, как это возможнодать вам дополнительные опции.
subject(:object) {FactoryGirl.create :object}