আরএসপেক: লেট এবং ব্লকের আগে পার্থক্য কী?


90

আরএসপেকের letএকটি beforeব্লকের মধ্যে পার্থক্য কী ?

এবং যখন প্রতিটি ব্যবহার করবেন?

নীচের উদাহরণে ভাল পদ্ধতির (যাক বা আগে) কী হবে?

let(:user) { User.make !}
let(:account) {user.account.make!}

before(:each) do
 @user = User.make!
 @account = @user.account.make!
end

আমি এই স্ট্যাকওভারফ্লো পোস্টটি অধ্যয়ন করেছি

তবে উপরের মতো সমিতির জিনিসপত্রের জন্য সংজ্ঞা দেওয়া কি ভাল?


4
মূলত, 'লেট' এমন লোকেরা ব্যবহার করেন যারা উদাহরণের পরিবর্তনশীলগুলি অপছন্দ করে। পার্শ্ব নোট হিসাবে, আপনার ফ্যাক্টরিগার্ল বা অনুরূপ সরঞ্জাম ব্যবহার করা উচিত।
এনিয়াডিং

উত্তর:


147

লোকেরা মনে হয় যে তারা কিছু প্রাথমিক পদ্ধতিতে পৃথক হয়েছে যার মধ্যে তারা পৃথক হয়েছে, কিন্তু এগুলি রেখে গেছে 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চশমাগুলির জন্য নিজেকে বড় ব্লকগুলি লিখতে দেখেন তবে আপনার কারখানাগুলি পরীক্ষা করুন এবং নিশ্চিত করুন যে আপনি বৈশিষ্ট্য এবং তাদের নমনীয়তা পুরোপুরি বুঝতে পেরেছেন।

আগে (: সমস্ত) ব্লক

বর্তমান প্রসঙ্গে (এবং এর শিশুদের) চশমার আগে এগুলি কেবল একবারই কার্যকর করা হয়। সঠিকভাবে লিখিতভাবে এগুলি দুর্দান্ত সুবিধার জন্য ব্যবহার করা যেতে পারে, কারণ কিছু কার্যকর পরিস্থিতি রয়েছে যা এটি কার্যকর করে এবং প্রচেষ্টাকে হ্রাস করতে পারে।

একটি উদাহরণ (যা কার্যকরভাবে কার্যকর করার সময়টিকে মোটেই প্রভাবিত করবে) একটি পরীক্ষার জন্য একটি এনএনভি ভেরিয়েবলকে উপহাস করছে, যা আপনাকে কেবল একবারই করা উচিত।

আশা করি এইটি কাজ করবে :)


ন্যূনতমতম ব্যবহারকারীদের জন্য, যা আমি কিন্তু আমি এই প্রশ্নোত্তরের আরএসপেক ট্যাগটি লক্ষ্য করিনি, before(:all)মিনিটেষ্টে বিকল্পটি বিদ্যমান নেই। মন্তব্যগুলিতে এখানে কিছুটা ভিন্ন প্রস্তাব দেওয়া হয়েছে
MrYoshiji

নিবন্ধটি রেফারেন্সটি একটি মৃত লিঙ্ক: \
ডিলান পিয়ার্স

ধন্যবাদ @ ডায়ালান পিয়ার্স আমি এই নিবন্ধটির কোনও অনুলিপি খুঁজে পাচ্ছি না, সুতরাং আমি একটি এসও উত্তর উল্লেখ করেছি যা এর পরিবর্তে সম্বোধন করেছে :)
জয়

ধন্যবাদ :) অনেক প্রশংসিত
ডিলান পিয়ার্স

4
itsআরএসপেক-কোর-এ আর নেই। আরও আধুনিক, মূর্খতাপূর্ণ উপায় it { is_expected.to be_awesome }
যুবিন

26

প্রায় সবসময়ই, আমি পছন্দ করি let। আপনার লিঙ্ক করা পোস্টটি উল্লেখ করে যে letএটি আরও দ্রুত। যাইহোক, অনেক সময়, যখন অনেকগুলি কমান্ড কার্যকর করতে হয়, আমি ব্যবহার করতে পারি before(:each)কারণ অনেকগুলি কমান্ড জড়িত থাকার সাথে এর সিনট্যাক্সটি আরও স্পষ্ট হয়।

আপনার উদাহরণে, আমি অবশ্যই letপরিবর্তে ব্যবহার করতে পছন্দ করব before(:each)। সাধারণভাবে বলতে গেলে, যখন কিছু পরিবর্তনশীল সূচনা সম্পন্ন হয় তখন আমার ব্যবহার পছন্দ হয় let


15

একটি বড় পার্থক্য যা উল্লেখ করা হয়নি তা হ'ল letসংজ্ঞাযুক্ত ভেরিয়েবলগুলি প্রথম বার না বলা পর্যন্ত তাত্ক্ষণিকভাবে পরিণত হয় না it সুতরাং যখন কোনও before(:each)ব্লক সমস্ত ভেরিয়েবলগুলি ইনস্ট্যান্ট করে তুলবে, letচলুন আপনি একাধিক পরীক্ষার জন্য ব্যবহার করতে পারেন এমন বেশ কয়েকটি ভেরিয়েবল সংজ্ঞায়িত করুন, এটি স্বয়ংক্রিয়ভাবে সেগুলি ইনস্ট্যান্ট করে না doesn't এটি না জেনে আপনার পরীক্ষাগুলি আবার নিজেকে কাটাতে পারে যদি আপনি আগে থেকেই সমস্ত ডেটা লোড হওয়ার আশা করছেন। কিছু ক্ষেত্রে, আপনি এমনকি বেশ কয়েকটি letভেরিয়েবল সংজ্ঞায়িত করতে চাইতে পারেন , তারপরে before(:each)প্রতিটি letউদাহরণে কল করার জন্য একটি ব্লক ব্যবহার করুন কেবলমাত্র ডেটা শুরু হওয়ার জন্য উপলব্ধ কিনা তা নিশ্চিত করতে।


20
আপনি let!প্রতিটি উদাহরণের আগে ডাকা পদ্ধতিগুলি সংজ্ঞায়িত করতে ব্যবহার করতে পারেন । আরএসপেক ডক্স দেখুন ।
জিম স্টুয়ার্ট

3

দেখে মনে হচ্ছে আপনি মেশিনিস্ট ব্যবহার করছেন। সাবধান, আপনি মেক দিয়ে কিছু সমস্যা দেখতে পাবেন! গ্লোবাল ফিক্সচার লেনদেনের বাইরে (নন-ব্যাং সংস্করণ) এর অভ্যন্তরে (যদি আপনি লেনদেনের ফিক্সারগুলিও ব্যবহার করে থাকেন) যাতে আপনার অন্যান্য পরীক্ষার জন্য ডেটাটিকে দূষিত করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.