লোকেরা মনে হয় যে তারা কিছু প্রাথমিক পদ্ধতিতে পৃথক হয়েছে যার মধ্যে তারা পৃথক হয়েছে, কিন্তু এগুলি রেখে গেছে before(:all)
এবং কেন তাদের ব্যবহার করা উচিত তা ঠিক ব্যাখ্যা করে না।
এটি আমার বিশ্বাস যে দৃষ্টান্তের ভেরিয়েবলগুলির বেশিরভাগ চশমাতে ব্যবহৃত হচ্ছে না, আংশিকভাবে এই উত্তরে বর্ণিত কারণে , তাই আমি এখানে একটি বিকল্প হিসাবে উল্লেখ করব না।
ব্লক করা যাক
কোনও let
ব্লকের মধ্যে কোড কেবল তখনই প্রয়োগ করা হয় যখন রেফারেন্স করা হয়, অলস লোড হওয়ার অর্থ এই যে এই ব্লকের ক্রমটি অপ্রাসঙ্গিক। এটি আপনাকে আপনার চশমাগুলির মাধ্যমে পুনরাবৃত্তি সেটআপ কাটাতে প্রচুর পরিমাণে শক্তি দেয়।
এর একটি (অত্যন্ত ছোট এবং স্বীকৃত) উদাহরণ:
let(:person) { build(:person) }
subject(:result) { Library.calculate_awesome(person, has_moustache) }
context 'with a moustache' do
let(:has_moustache) { true }
its(:awesome?) { should be_true }
end
context 'without a moustache' do
let(:has_moustache) { false }
its(:awesome?) { should be_false }
end
আপনি has_moustache
প্রতিটি ক্ষেত্রে এটি আলাদাভাবে সংজ্ঞায়িত দেখতে পারেন তবে subject
সংজ্ঞাটি পুনরাবৃত্তি করার দরকার নেই । কিছু গুরুত্বপূর্ণ বিষয় লক্ষ্যণীয় হ'ল let
বর্তমান প্রসঙ্গে বর্ণিত শেষ ব্লকটি ব্যবহার করা হবে। এটি বেশিরভাগ চশমা ব্যবহারের জন্য ডিফল্ট সেট করার জন্য ভাল, যা প্রয়োজনে ওভাররাইট করা যেতে পারে।
উদাহরণস্বরূপ, সত্য হিসাবে সেট করা calculate_awesome
কোনও person
মডেল পাস হলে এর রিটার্ন মানটি পরীক্ষা করা top_hat
, তবে কোনও গোঁফ হবে না:
context 'without a moustache but with a top hat' do
let(:has_moustache) { false }
let(:person) { build(:person, top_hat: true) }
its(:awesome?) { should be_true }
end
অন্য যে বিষয়গুলি ব্লক করা উচিত সেগুলি সম্পর্কে লক্ষ্য রাখার জন্য, আপনি যদি ডাটাবেজে সংরক্ষণ করা কিছু (যেমন Library.find_awesome_people(search_criteria)
) অনুসন্ধান করে থাকেন তবে সেগুলি ব্যবহার করা উচিত নয় কারণ তারা ইতিমধ্যে রেফারেন্স না থাকলে ডাটাবেসে সংরক্ষণ করা হবে না। let!
বা before
ব্লকগুলি এখানে ব্যবহার করা উচিত।
এছাড়াও, কখনও কখনও ব্লকগুলি before
কার্যকর করতে ট্রিগার করতে ব্যবহার করবেন নাlet
, let!
এটিই এটির জন্য তৈরি করা হয়!
দিন! ব্লক
let!
ব্লকগুলি নির্ধারিত ক্রমে কার্যকর করা হয় (অনেকটা ব্লকের আগের মতো)। ব্লকগুলির আগে একটি মূল পার্থক্য হ'ল উদাহরণ ভেরিয়েবলের কাছে ফিরে আসার পরিবর্তে আপনি এই ভেরিয়েবলের একটি স্পষ্ট উল্লেখ পেতে পারেন।
সঙ্গে let
ব্লক, যদি একাধিক let!
ব্লক একই নামের সংজ্ঞায়িত করা হয়, সবচেয়ে সাম্প্রতিক কি মৃত্যুদন্ড ব্যবহার করা হবে। মূল পার্থক্য হ'ল let!
ব্লকগুলি এরকমভাবে ব্যবহার করা হলে একাধিকবার কার্যকর করা হবে, যেখানে let
ব্লকটি কেবলমাত্র শেষ বার কার্যকর করা হবে।
আগে (: প্রতিটি) ব্লক
before(:each)
ব্লকের আগে ডিফল্ট, এবং তাই প্রতিবার before {}
পূর্ণরূপ উল্লেখের চেয়ে উল্লেখ করা যায় before(:each) {}
।
before
কয়েকটি মূল পরিস্থিতিতে ব্লক ব্যবহার করা আমার ব্যক্তিগত পছন্দ । আমি ব্লকের আগে ব্যবহার করব যদি:
- আমি উপহাস, স্টাব্বিং বা ডাবলস ব্যবহার করছি s
- কোনও যুক্তিসঙ্গত আকারের সেটআপ আছে (সাধারণত এটি এমন একটি চিহ্ন যা আপনার কারখানার বৈশিষ্ট্যগুলি সঠিকভাবে সেটআপ করা হয়নি)
- এখানে বেশ কয়েকটি ভেরিয়েবল রয়েছে যা আমার সরাসরি উল্লেখ করার দরকার নেই, তবে সেটআপের জন্য প্রয়োজনীয়
- আমি রেলগুলিতে ফাংশনাল কন্ট্রোলার পরীক্ষা লিখছি এবং আমি পরীক্ষার জন্য একটি নির্দিষ্ট অনুরোধ (যেমন
before { get :index }
) সম্পাদন করতে চাই । যদিও আপনি subject
এটির জন্য প্রচুর ক্ষেত্রে ব্যবহার করতে পারেন , আপনার যদি কোনও রেফারেন্সের প্রয়োজন না হয় তবে এটি কখনও কখনও আরও স্পষ্ট বোধ করে।
আপনি যদি নিজের before
চশমাগুলির জন্য নিজেকে বড় ব্লকগুলি লিখতে দেখেন তবে আপনার কারখানাগুলি পরীক্ষা করুন এবং নিশ্চিত করুন যে আপনি বৈশিষ্ট্য এবং তাদের নমনীয়তা পুরোপুরি বুঝতে পেরেছেন।
আগে (: সমস্ত) ব্লক
বর্তমান প্রসঙ্গে (এবং এর শিশুদের) চশমার আগে এগুলি কেবল একবারই কার্যকর করা হয়। সঠিকভাবে লিখিতভাবে এগুলি দুর্দান্ত সুবিধার জন্য ব্যবহার করা যেতে পারে, কারণ কিছু কার্যকর পরিস্থিতি রয়েছে যা এটি কার্যকর করে এবং প্রচেষ্টাকে হ্রাস করতে পারে।
একটি উদাহরণ (যা কার্যকরভাবে কার্যকর করার সময়টিকে মোটেই প্রভাবিত করবে) একটি পরীক্ষার জন্য একটি এনএনভি ভেরিয়েবলকে উপহাস করছে, যা আপনাকে কেবল একবারই করা উচিত।
আশা করি এইটি কাজ করবে :)