let ist funktional, da es im Wesentlichen ein Proc ist. Auch es ist zwischengespeichert.
Ein Gotcha, das ich sofort mit let gefunden habe ... In einem Spec-Block, der eine Änderung auswertet.
let(:object) {FactoryGirl.create :object}
expect {
post :destroy, id: review.id
}.to change(Object, :count).by(-1)
Sie müssen sicher sein, dass Sie let
außerhalb Ihres Erwartungsblocks anrufen . dh Sie rufen FactoryGirl.create
in Ihrem Let-Block an. Normalerweise überprüfe ich, ob das Objekt erhalten bleibt.
object.persisted?.should eq true
Andernfalls let
wird beim ersten Aufruf des Blocks aufgrund der verzögerten Instanziierung tatsächlich eine Änderung in der Datenbank vorgenommen.
Aktualisieren
Einfach eine Notiz hinzufügen. Seien Sie vorsichtig beim Spielen von Code Golf oder in diesem Fall Rspec Golf mit dieser Antwort.
In diesem Fall muss ich nur eine Methode aufrufen, auf die das Objekt reagiert. Also rufe ich die _.persisted?
_-Methode für das Objekt als seine Wahrheit auf. Ich versuche nur, das Objekt zu instanziieren. Sie könnten leer anrufen? oder null? zu. Es geht nicht um den Test, sondern darum, das Objekt zum Leben zu erwecken, indem man es nennt.
Sie können also nicht umgestalten
object.persisted?.should eq true
sein
object.should be_persisted
da das Objekt nicht instanziiert wurde ... ist es faul. :) :)
Update 2
Nutzen Sie die Vermietung! Syntax für die sofortige Objekterstellung, die dieses Problem insgesamt vermeiden sollte. Beachten Sie jedoch, dass dies einen Großteil des Zwecks der Faulheit des nicht geknallten Let zunichte macht.
In einigen Fällen möchten Sie möglicherweise auch die Betreff-Syntax nutzen, anstatt sie zuzulassen, da Sie dadurch möglicherweise zusätzliche Optionen erhalten.
subject(:object) {FactoryGirl.create :object}