আসুন এটির মূলত একটি প্রক হিসাবে কার্যকর হয়। এটির ক্যাশেড
একটি গ্যাচা আমি সাথে সাথে খুঁজে পেয়েছি ... একটি স্পষ্ট ব্লকে যা পরিবর্তনের মূল্যায়ন করছে।
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
ব্লকটি প্রথমবার বলা হয় তখন অলস তাত্ক্ষণিকতার কারণে ডাটাবেসে পরিবর্তন আসলে ঘটবে।
হালনাগাদ
শুধু একটি নোট যোগ করুন। খেলে সাবধানতা অবলম্বন করুনকোড গল্ফ বা এই ক্ষেত্রে আরএসপেক গল্ফ এই উত্তরটি সহ ।
এই ক্ষেত্রে, আমাকে কেবল এমন কিছু পদ্ধতি কল করতে হবে যাতে অবজেক্ট সাড়া দেয়। সুতরাং আমি প্রার্থনা_.persisted?
_ পদ্ধতিরটিকে সত্য হিসাবে চিহ্নিত করছি। আমি যা করার চেষ্টা করছি তা হ'ল অবজেক্টটি ইনস্ট্যান্ট করা। আপনি খালি কল করতে পারেন? না শিল? খুব। বিন্দুটি পরীক্ষা নয় বরং এটি কল করে অবজেক্টটিকে ওটি লাইফ করে আনা।
সুতরাং আপনি চুল্লী করতে পারবেন না
object.persisted?.should eq true
হতে
object.should be_persisted
যেহেতু বস্তুটি তাত্ক্ষণিকভাবে চালিত হয়নি ... এটি অলস। :)
আপডেট 2
লিভারেজ যাক! তাত্ক্ষণিক অবজেক্ট তৈরির জন্য বাক্য গঠন , যা পুরোপুরি এই সমস্যাটি এড়ানো উচিত। নোট করুন যদিও এটি অ-ব্যঞ্জড লেটের অলসতার উদ্দেশ্যটিকে অনেকটাই পরাজিত করবে।
এছাড়াও কিছু ক্ষেত্রে আপনি সম্ভবত বিষয়বস্তু সিনট্যাক্সটি উপস্থাপনের পরিবর্তে এটির অতিরিক্ত বিকল্পগুলি দিতে পারেন synt
subject(:object) {FactoryGirl.create :object}