Let est fonctionnel car c'est essentiellement un Proc. Aussi son caché.
Un problème que j'ai trouvé tout de suite avec let ... Dans un bloc Spec qui évalue un changement.
let(:object) {FactoryGirl.create :object}
expect {
post :destroy, id: review.id
}.to change(Object, :count).by(-1)
Vous devez être sûr d'appeler en let
dehors de votre bloc d'attente. c'est-à-dire que vous appelez FactoryGirl.create
dans votre bloc let. Je le fais généralement en vérifiant que l'objet est persistant.
object.persisted?.should eq true
Sinon, lorsque le let
bloc est appelé la première fois, un changement dans la base de données se produit en raison de l'instanciation paresseuse.
Mise à jour
Il suffit d'ajouter une note. Soyez prudent en jouant au golf à code ou dans ce cas au golf rspec avec cette réponse.
Dans ce cas, je n'ai qu'à appeler une méthode à laquelle l'objet répond. _.persisted?
J'invoque donc la méthode _ sur l'objet comme étant véridique. Tout ce que j'essaie de faire, c'est d'instancier l'objet. Vous pourriez appeler vide? ou nul? aussi. Le point n'est pas le test mais donner vie à l'objet en l'appelant.
Vous ne pouvez donc pas refactoriser
object.persisted?.should eq true
être
object.should be_persisted
comme l'objet n'a pas été instancié ... c'est paresseux. :)
Update 2
tirer parti de la laisser! syntaxe pour la création instantanée d'objets, ce qui devrait éviter complètement ce problème. Notez bien que cela ira à l'encontre de l'objectif de la paresse du let non frappé.
De plus, dans certains cas, vous souhaiterez peut-être utiliser la syntaxe du sujet au lieu de la laisser car cela peut vous donner des options supplémentaires.
subject(:object) {FactoryGirl.create :object}