let jest funkcjonalny, ponieważ zasadniczo jest proc. Również jest buforowany.
Jeden problem, który znalazłem od razu z let ... W bloku Spec, który ocenia zmianę.
let(:object) {FactoryGirl.create :object}
expect {
post :destroy, id: review.id
}.to change(Object, :count).by(-1)
Musisz koniecznie zadzwonić let
poza oczekiwany blok. tzn. dzwonisz FactoryGirl.create
w let Let Block. Zazwyczaj robię to, sprawdzając, czy obiekt jest utrwalony.
object.persisted?.should eq true
W przeciwnym razie, gdy let
blok zostanie wywołany po raz pierwszy, zmiana w bazie danych rzeczywiście nastąpi z powodu opóźnionego tworzenia instancji.
Aktualizacja
Właśnie dodam notatkę. Ostrożnie graj golfa kodowego lub w tym przypadku rspec golfa z tą odpowiedzią.
W takim przypadku muszę po prostu wywołać metodę, na którą obiekt reaguje. Więc wzywam_.persisted?
wywołuję metodę _ na obiekcie jako jego prawdziwość. Próbuję tylko utworzyć obiekt. Mógłbyś zadzwonić pusty? czy zero? też. Nie chodzi o test, ale o powołanie obiektu do życia, nazywając go.
Więc nie możesz refaktoryzować
object.persisted?.should eq true
być
object.should be_persisted
ponieważ obiekt nie został utworzony ... jest leniwy. :)
Aktualizacja 2
wykorzystać let! składnia do natychmiastowego tworzenia obiektów, co powinno całkowicie uniknąć tego problemu. Zauważ jednak, że pokona on wiele celów lenistwa bez uderzeń.
Również w niektórych przypadkach możesz chcieć wykorzystać składnię tematu zamiast pozwolić, ponieważ może to dać dodatkowe opcje.
subject(:object) {FactoryGirl.create :object}