пусть является функциональным, так как по сути это 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
блок вызывается в первый раз, изменение в базе данных фактически произойдет из-за ленивого создания экземпляра.
Обновить
Просто добавляю заметку. Будьте осторожны, играя в гольф с кодом или в этом случае с этим ответом.
В этом случае мне просто нужно вызвать метод, на который отвечает объект. Поэтому я _.persisted?
вызываю метод _ для объекта как истинный. Все, что я пытаюсь сделать, это создать экземпляр объекта. Вы могли бы назвать пустым? или ноль? тоже. Дело не в тесте, а в том, чтобы оживить объект, вызвав его.
Таким образом, вы не можете рефакторинг
object.persisted?.should eq true
быть
object.should be_persisted
как объект не был создан ... его ленивый. :)
Обновление 2
рычаг пусть! синтаксис для мгновенного создания объекта, который должен полностью избежать этой проблемы. Заметьте, однако, что это побеждает многие цели лени без взрыва.
Также в некоторых случаях вы можете использовать синтаксис субъекта вместо let, поскольку это может дать вам дополнительные опции.
subject(:object) {FactoryGirl.create :object}