let è funzionale in quanto essenzialmente un Proc. Inoltre è memorizzato nella cache.
Un gotcha che ho trovato subito con let ... In un blocco Spec che sta valutando una modifica.
let(:object) {FactoryGirl.create :object}
expect {
post :destroy, id: review.id
}.to change(Object, :count).by(-1)
Dovrai essere sicuro di chiamare let
al di fuori del tuo blocco di attesa. cioè stai chiamando FactoryGirl.create
nel tuo blocco let. Di solito lo faccio verificando che l'oggetto sia persistente.
object.persisted?.should eq true
Altrimenti, quando il let
blocco viene chiamato la prima volta, si verificherà effettivamente una modifica nel database a causa dell'istanza pigra.
Aggiornare
Sto solo aggiungendo una nota. Fai attenzione a giocare a code golf o in questo caso a rspec golf con questa risposta.
In questo caso, devo solo chiamare un metodo a cui l'oggetto risponde. Quindi invoco il _.persisted?
metodo _ sull'oggetto come verità. Tutto quello che sto cercando di fare è creare un'istanza dell'oggetto. Potresti chiamare vuoto? o zero? pure. Il punto non è il test ma portare l'oggetto alla vita chiamandolo.
Quindi non puoi refactoring
object.persisted?.should eq true
essere
object.should be_persisted
poiché l'oggetto non è stato istanziato ... è pigro. :)
Aggiornamento 2
sfruttare il let! sintassi per la creazione istantanea di oggetti, che dovrebbe evitare del tutto questo problema. Nota però che sconfiggerà molto lo scopo della pigrizia del let non sbattuto.
Inoltre, in alcuni casi potresti voler effettivamente sfruttare la sintassi del soggetto invece di lasciare in quanto ti potrebbe dare opzioni aggiuntive.
subject(:object) {FactoryGirl.create :object}