let é funcional, pois é essencialmente um Proc. Também está em cache.
Uma pegadinha que eu encontrei imediatamente com let ... Em um bloco Spec que está avaliando uma alteração.
let(:object) {FactoryGirl.create :object}
expect {
post :destroy, id: review.id
}.to change(Object, :count).by(-1)
Você precisará ligar let
fora do seu bloco de espera. ou seja, você está ligando FactoryGirl.create
no seu bloco let. Geralmente faço isso verificando se o objeto persiste.
object.persisted?.should eq true
Caso contrário, quando o let
bloco for chamado pela primeira vez, uma alteração no banco de dados ocorrerá devido à instanciação lenta.
Atualizar
Apenas adicionando uma nota. Tenha cuidado ao jogar código golf ou, neste caso, rspec golf com esta resposta.
Nesse caso, só preciso chamar algum método ao qual o objeto responde. Então, eu invoco o _.persisted?
método _ no objeto como sua verdade. Tudo o que estou tentando fazer é instanciar o objeto. Você poderia ligar em branco? ou nada? também. A questão não é o teste, mas trazer o objeto da vida, chamando-o.
Então você não pode refatorar
object.persisted?.should eq true
ser estar
object.should be_persisted
como o objeto não foi instanciado ... é preguiçoso. :)
Atualização 2
alavancar o let! sintaxe para criação instantânea de objetos, o que deve evitar esse problema completamente. Note que isso derrotará muitos dos propósitos da preguiça do let não batido.
Além disso, em alguns casos, você pode realmente aproveitar a sintaxe do assunto em vez de deixar, pois isso pode oferecer opções adicionais.
subject(:object) {FactoryGirl.create :object}