সংক্ষিপ্তসার: আরএসপেকের বিষয়টি একটি বিশেষ ভেরিয়েবল যা পরীক্ষিত বস্তুটিকে বোঝায়। এতে প্রত্যাশা অন্তর্নিহিতভাবে সেট করা যেতে পারে, যা এক-লাইনের উদাহরণগুলিকে সমর্থন করে। এটি কিছু মুশকিল ক্ষেত্রে পাঠকের কাছে স্পষ্ট, তবে অন্যথায় বোঝা শক্ত এবং এড়ানো উচিত। RSpec এর let
ভেরিয়েবল শুধু প্রখর রৌদ্রে instantiated হয় (memoized) ভেরিয়েবল। এগুলি বিষয়টির মতো অনুসরণ করা ততটা কঠিন নয়, তবে তারা জট বাঁধার পরীক্ষাগুলি নিয়ে যেতে পারে তাই বিচক্ষণতার সাথে ব্যবহার করা উচিত।
বিষয়
কিভাবে এটা কাজ করে
বিষয়টি হচ্ছে পরীক্ষিত বস্তুটি। আরএসপেকের বিষয়টির একটি স্পষ্ট ধারণা রয়েছে। এটি সংজ্ঞায়িত বা নাও হতে পারে। যদি এটি হয় তবে আরএসপেক এটিকে স্পষ্টভাবে উল্লেখ না করে পদ্ধতিতে কল করতে পারে।
ডিফল্টরূপে, যদি বহিরাগত উদাহরণ গোষ্ঠীর ( describe
বা context
ব্লক) প্রথম আর্গুমেন্টটি কোনও শ্রেণি হয়, আরএসপেক class শ্রেণীর একটি উদাহরণ তৈরি করে এবং বিষয়টিতে নির্ধারিত করে। উদাহরণস্বরূপ, নিম্নলিখিত পাস:
class A
end
describe A do
it "is instantiated by RSpec" do
expect(subject).to be_an(A)
end
end
আপনি নিজের সাথে বিষয়টিকে সংজ্ঞায়িত করতে পারেন subject
:
describe "anonymous subject" do
subject { A.new }
it "has been instantiated" do
expect(subject).to be_an(A)
end
end
আপনি বিষয়টিকে এটি সংজ্ঞায়িত করার সময় একটি নাম দিতে পারেন:
describe "named subject" do
subject(:a) { A.new }
it "has been instantiated" do
expect(a).to be_an(A)
end
end
এমনকি যদি আপনি বিষয়টির নাম দেন, আপনি এখনও বেনামে উল্লেখ করতে পারেন:
describe "named subject" do
subject(:a) { A.new }
it "has been instantiated" do
expect(subject).to be_an(A)
end
end
আপনি একাধিক নামযুক্ত বিষয় সংজ্ঞায়িত করতে পারেন। সর্বাধিক সংজ্ঞায়িত নামযুক্ত বিষয় বেনামে subject
।
তবে বিষয়টি সংজ্ঞায়িত করা হয়েছে,
এটি অলসভাবে ইনস্ট্যান্টেশনযুক্ত। তা হল, বর্ণিত শ্রেণীর অন্তর্নিহিত তাত্ক্ষণিকতা বা ব্লকটির সম্পাদন পাস subject
হওয়া অবধি ঘটে না subject
বা নামকৃত বিষয়টিকে উদাহরণ হিসাবে উল্লেখ না করা পর্যন্ত ঘটে না । আপনি যদি চান যে আপনার স্পষ্ট বিষয়টি আগ্রহের সাথে ইনস্ট্যান্ট করা হোক (এর গ্রুপে উদাহরণের আগে) এটির subject!
পরিবর্তে বলুন subject
।
প্রত্যাশাগুলি স্পষ্টতই এটিতে সেট করা যেতে পারে (কোনও লেখা subject
বা নামকরণের বিষয় ছাড়াই ):
describe A do
it { is_expected.to be_an(A) }
end
এই এক-লাইন বাক্য গঠনটিকে সমর্থন করার জন্য বিষয়টি বিদ্যমান।
কখন এটি ব্যবহার করবেন
একটি অন্তর্নিহিত subject
(উদাহরণ গোষ্ঠী থেকে অনুমান করা) বোঝা কঠিন কারণ কারণ
- এটি পর্দার পিছনে তাত্ক্ষণিক।
is_expected
এটি সুস্পষ্টভাবে ব্যবহার করা হোক ( সুস্পষ্ট গ্রহণকারী ব্যতীত কল করে ) বা স্পষ্টভাবে (যেমন subject
), এটি পাঠককে সেই বস্তুর ভূমিকা বা প্রকৃতি সম্পর্কে কোন তথ্য দেয় না যার উপর প্রত্যাশা বলা হচ্ছে।
- ওয়ান-লাইনারের উদাহরণ সিনট্যাক্সের উদাহরণের বর্ণনা নেই (
it
সাধারণ উদাহরণ সিনট্যাক্সের স্ট্রিং আর্গুমেন্ট ), সুতরাং উদাহরণটির উদ্দেশ্য সম্পর্কে পাঠকের কেবলমাত্র তথ্যই প্রত্যাশা।
সুতরাং, প্রসঙ্গটি সমস্ত পাঠকের দ্বারা প্রাসঙ্গিকভাবে ভালভাবে বোঝার সম্ভাবনা থাকে এবং উদাহরণের বর্ণনার জন্য সত্যই প্রয়োজন হয় না এমন ক্ষেত্রে অন্তর্নিহিত বিষয়টি ব্যবহার করা কেবলমাত্র সহায়ক । ক্যানোনিকাল কেসটি কাঁটা ম্যাথারগুলির সাথে অ্যাক্টিভেকর্ড বৈধতা পরীক্ষা করছে:
describe Article do
it { is_expected.to validate_presence_of(:title) }
end
বেনামে প্রকাশিত subject
( subject
নাম ছাড়াই সংজ্ঞায়িত ) কিছুটা ভাল, কারণ পাঠক দেখতে পাবেন কীভাবে এটি ইনস্ট্যান্ট হয়, তবে
- এটি এখনও বিষয়টির ইনস্ট্যান্টেশনটি যেখানে এটি ব্যবহার করা হয়েছে তার থেকে দূরে রাখতে পারে (উদাহরণস্বরূপ একটি উদাহরণ গোষ্ঠীর শীর্ষে এটি ব্যবহার করে এমন অনেক উদাহরণ রয়েছে), যা এখনও অনুসরণ করা শক্ত এবং
- এতে অন্যান্য সমস্যা রয়েছে যা অন্তর্ভুক্ত বিষয়টি করে।
একটি নামযুক্ত বিষয়টি একটি উদ্দেশ্য-প্রকাশকারী নাম সরবরাহ করে, তবে let
আপনি যদি কিছু সময় বেনামী বিষয় ব্যবহার করতে চান তবে একটি পরিবর্তনশীলের পরিবর্তে নামকরণ করা বিষয়টি ব্যবহার করার একমাত্র কারণ এবং বেনামি বিষয়টি কেন বোঝা শক্ত তা আমরা কেবল ব্যাখ্যা করেছি explained
সুতরাং, সুস্পষ্ট বেনামে subject
বা নামযুক্ত বিষয়ের বৈধ ব্যবহারগুলি খুব বিরল ।
let
পরিবর্তনশীল
তারা কিভাবে কাজ করে
let
ভেরিয়েবল দুটি পার্থক্য ব্যতীত কেবল নামকরণের বিষয়গুলির মতো:
- তারা সংজ্ঞায়িত করছি
let
/ let!
পরিবর্তে subject
/subject!
- তারা বেনামে সেট করে না
subject
বা প্রত্যাশাকে এটিকে স্পষ্টতই কল করার অনুমতি দেয় না।
এগুলি কখন ব্যবহার করবেন
let
উদাহরণগুলির মধ্যে সদৃশতা হ্রাস করতে এটি সম্পূর্ণ বৈধ । যাইহোক, এটি কেবল তখনই করুন যখন এটি পরীক্ষার স্পষ্টতা ত্যাগ করে না। ব্যবহারের সবচেয়ে নিরাপদ সময়টি let
যখন let
ভেরিয়েবলের উদ্দেশ্যটি তার নাম থেকে সম্পূর্ণ পরিষ্কার হয় (যাতে পাঠকের এমন সংজ্ঞাটি খুঁজে না পেতে হয়, যা প্রতিটি উদাহরণ বোঝার জন্য অনেক লাইন দূরে হতে পারে) এবং এটি একইভাবে ব্যবহৃত হয় প্রতিটি উদাহরণে। যদি এই বিষয়গুলির মধ্যে দুটিও সত্য না হয় তবে একটি সাধারণ প্লেইন স্থানীয় ভেরিয়েবলের মধ্যে অবজেক্টটি সংজ্ঞায়িত করার বা উদাহরণস্বরূপ কারখানার পদ্ধতি কল করার বিষয়ে বিবেচনা করুন।
let!
ঝুঁকিপূর্ণ, কারণ এটি অলস নয়। যদি কেউ উদাহরণ দলে একটি উদাহরণ যুক্ত করে যা এতে রয়েছে let!
তবে উদাহরণটি let!
ভেরিয়েবলের প্রয়োজন নেই ,
- সেই উদাহরণটি বুঝতে অসুবিধা হবে, কারণ পাঠক
let!
পরিবর্তনশীলটি দেখতে পাবে এবং ভাববে যে উদাহরণটি কীভাবে এবং কীভাবে প্রভাবিত করে
- উদাহরণটি
let!
ভেরিয়েবল তৈরি করতে সময় লাগার কারণে এটি হওয়া দরকারের তুলনায় ধীর হবে
সুতরাং let!
, যদি মোটামুটি, কেবলমাত্র ছোট, সাধারণ উদাহরণ দলে ব্যবহার করুন যেখানে ভবিষ্যতের উদাহরণ লেখকরা এই ফাঁদে পড়ার সম্ভাবনা কম রয়েছে।
একক প্রত্যাশা-প্রতি-উদাহরণ ফেটিশ
সাবজেক্ট বা let
ভেরিয়েবলগুলির একটি সাধারণ অতিরিক্ত ব্যবহার রয়েছে যা আলাদাভাবে আলোচনা করার জন্য গুরুত্বপূর্ণ। কিছু লোক তাদের এগুলি ব্যবহার করতে পছন্দ করে:
describe 'Calculator' do
describe '#calculate' do
subject { Calculator.calculate }
it { is_expected.to be >= 0 }
it { is_expected.to be <= 9 }
end
end
(এটি এমন একটি পদ্ধতির একটি সাধারণ উদাহরণ যা একটি সংখ্যার প্রত্যাবর্তন করে যার জন্য আমাদের দুটি প্রত্যাশা প্রয়োজন, তবে এই শৈলীতে আরও অনেকগুলি উদাহরণ / প্রত্যাশা থাকতে পারে যদি পদ্ধতিটি আরও জটিল মূল্য দেয় যা অনেক প্রত্যাশার প্রয়োজন হয় এবং / অথবা এর অনেকগুলি পার্শ্ব প্রতিক্রিয়া রয়েছে) সবার প্রত্যাশা দরকার।)
লোকেরা এগুলি করেছে কারণ তারা শুনেছেন যে উদাহরণের জন্য একজনের কেবলমাত্র একটি প্রত্যাশা থাকা উচিত (যা বৈধ নিয়মের সাথে মিশে গেছে যে উদাহরণ হিসাবে কেবলমাত্র একটি পদ্ধতি কল পরীক্ষা করা উচিত) বা তারা আরএসপেকের কৌতূহলের প্রেমে রয়েছে। এটি কোনও অজ্ঞাতনামা বা নামযুক্ত বিষয় বা let
ভেরিয়েবল সহ হোক না! এই শৈলীতে বেশ কয়েকটি সমস্যা রয়েছে:
- বেনামে বিষয় উদাহরণগুলির বিষয় নয় - পদ্ধতিটি বিষয়। এইভাবে পরীক্ষা লেখার ফলে ভাষাটি স্ক্রু হয়ে যায়, এটি সম্পর্কে ভাবা শক্ত করে তোলে।
- সর্বদা এক-লাইনের উদাহরণ সহ, প্রত্যাশার অর্থ ব্যাখ্যা করার মতো কোনও জায়গা নেই।
- বিষয়টি প্রতিটি উদাহরণের জন্য তৈরি করতে হবে, যা ধীর।
পরিবর্তে, একটি একক উদাহরণ লিখুন:
describe 'Calculator' do
describe '#calculate' do
it "returns a single-digit number" do
result = Calculator.calculate
expect(result).to be >= 0
expect(result).to be <= 9
end
end
end