चलो कार्यात्मक रूप से अनिवार्य रूप से एक प्रोक है। साथ ही इसकी कैश्ड भी।
एक गेचा मुझे ठीक से जाने दिया गया ... एक विशेष ब्लॉक में जो एक बदलाव का मूल्यांकन कर रहा है।
let(:object) {FactoryGirl.create :object}
expect {
post :destroy, id: review.id
}.to change(Object, :count).by(-1)
आपको let
अपने अपेक्षित ब्लॉक के बाहर कॉल करना सुनिश्चित करना होगा । यानी आप FactoryGirl.create
अपने लेट ब्लॉक में कॉल कर रहे हैं । मैं आम तौर पर इस बात को सत्यापित करने के द्वारा करता हूं कि वस्तु बनी हुई है।
object.persisted?.should eq true
अन्यथा जब let
ब्लॉक को पहली बार कहा जाता है तो डेटाबेस में बदलाव वास्तव में आलसी तात्कालिकता के कारण होगा।
अपडेट करें
सिर्फ एक नोट जोड़ना। इस जवाब के साथ कोड गोल्फ खेलने के मामले में या rspec गोल्फ से सावधान रहें ।
इस मामले में, मुझे बस कुछ विधि को कॉल करना होगा, जिस पर ऑब्जेक्ट प्रतिक्रिया करता है। इसलिए मैं _.persisted?
वस्तु पर उसके सत्य के रूप में _ विधि का आह्वान करता हूं । मैं जो कुछ करने की कोशिश कर रहा हूं, वह वस्तु को तुरंत करना है। आप खाली कह सकते हैं? या नील? भी। बिंदु परीक्षण नहीं है, लेकिन वस्तु ओटी जीवन को बुलाकर ला रहा है।
तो आप रिफ्लेक्टर नहीं कर सकते
object.persisted?.should eq true
होने के लिए
object.should be_persisted
के रूप में वस्तु तात्कालिक नहीं किया गया है ... अपनी आलसी। :)
अपडेट २
चलो लाभ ! तत्काल ऑब्जेक्ट निर्माण के लिए वाक्यविन्यास , जो इस मुद्दे को पूरी तरह से बचना चाहिए। ध्यान दें, हालांकि यह गैर-धमाकेदार लेट के आलस्य के उद्देश्य को पराजित करेगा।
इसके अलावा कुछ उदाहरणों में आप वास्तव में विषय के सिंटैक्स का लाभ उठाना चाह सकते हैं क्योंकि यह आपको अतिरिक्त विकल्प दे सकता है।
subject(:object) {FactoryGirl.create :object}