let, temelde bir Proc olarak işlevseldir. Ayrıca önbelleğe alınmış.
Bir tane olsun hemen buldum let ... Değişikliği değerlendiren bir Spec blok içinde.
let(:object) {FactoryGirl.create :object}
expect {
post :destroy, id: review.id
}.to change(Object, :count).by(-1)
let
Bekleme bloğunuzun dışında arama yaptığınızdan emin olmanız gerekir . yani FactoryGirl.create
izin bloğunu çağırıyorsun . Bunu genellikle nesnenin kalıcı olduğunu doğrulayarak yaparım.
object.persisted?.should eq true
Aksi takdirde, let
blok ilk kez çağrıldığında, tembel örnekleme nedeniyle veritabanında bir değişiklik gerçekleşir.
Güncelleme
Sadece bir not ekliyorum. Kod golf oynarken veya bu durumda bu cevapla rspec golf oynarken dikkatli olun .
Bu durumda, sadece nesnenin yanıt verdiği bazı yöntemi çağırmak zorundayım. Bu yüzden _.persisted?
nesne üzerindeki _ yöntemini gerçeği olarak çağırıyorum. Yapmaya çalıştığım tek şey nesneyi somutlaştırmak. Boş diyebilir misin? ya da nil? çok. Mesele test değil, nesneyi arayarak hayata getiriyor.
Yani refactor olamazsın
object.persisted?.should eq true
olmak
object.should be_persisted
çünkü nesne somutlaştırılmadı ... tembel. :)
Güncelleme 2
izin kaldıraç ! bu sorunu tamamen önlemek için anında nesne oluşturma sözdizimi . Olsa da çarptım izin tembellik amacı bir çok yenilgi unutmayın.
Ayrıca bazı durumlarda , size ek seçenekler sunabileceğinden, izin vermek yerine konu sözdizimini kullanmak isteyebilirsiniz.
subject(:object) {FactoryGirl.create :object}