RSpec-এ Mocks এবং Stubs ব্যবহার করা হয় বাহ্যিক ডিপেন্ডেন্সি বা নির্ভরশীলতাগুলির আচরণ অনুকরণ (mocking) এবং পরিবর্তন (stubbing) করতে। এটি মূলত টেস্ট লেখার সময় বাহ্যিক সিস্টেম বা ক্লাসের ওপর নির্ভরশীলতা দূর করতে সহায়ক, যাতে টেস্টটি নির্দিষ্ট অংশের আচরণ যাচাই করতে পারে।
Mocking: মকিং দ্বারা আমরা একটি অবজেক্টের ফাংশন বা মেথডের আচরণ অনুকরণ করি।
Stubbing: স্টাবিং দ্বারা আমরা একটি মেথডকে নির্দিষ্ট মান প্রদান করি, যাতে সেটি টেস্টের জন্য পূর্বনির্ধারিত ফলাফল প্রদান করে।
RSpec-এ allow এবং expect ব্যবহার করে Mocks এবং Stubs তৈরি করা যায়।
১. allow ব্যবহার করে Stub তৈরি
allow ব্যবহার করে মেথড স্টাব করা হয়। এটি মেথডটি একটি নির্দিষ্ট মান বা আচরণ প্রদান করতে বলে, কিন্তু এটি কখনও আন্তরিকভাবে কার্যকর হয় না।
উদাহরণ: allow দিয়ে Stub করা
ধরা যাক, আমাদের একটি User ক্লাস আছে, যা একটি API কল করে এবং সেটা থেকে তথ্য নিয়ে আসে। কিন্তু এই API কলের আচরণকে আমরা টেস্টে অগ্রাহ্য করতে চাই, যাতে প্রকৃত API কল না হয়ে একটি পূর্বনির্ধারিত মান ফিরিয়ে দেয়।
# user.rb
class User
def fetch_data
# API কল যা আমরা টেস্টে mock বা stub করতে চাই
"Real Data from API"
end
endটেস্ট কোড:
# spec/user_spec.rb
require './user'
describe User do
it "stub করে fetch_data মেথডটি" do
user = User.new
# allow দিয়ে মেথড স্টাব করা
allow(user).to receive(:fetch_data).and_return("Stubbed Data")
# এখন fetch_data মেথডটি 'Stubbed Data' ফেরত দেবে
expect(user.fetch_data).to eq("Stubbed Data")
end
endএখানে:
allow(user).to receive(:fetch_data).and_return("Stubbed Data"):fetch_dataমেথডটিStubbed Dataফেরত দিতে নির্দেশ দেয়, যদিও প্রকৃত API কল ঘটবে না।
২. expect ব্যবহার করে Mock তৈরি
expect ব্যবহার করে মক তৈরি করা হয়। এটি একটি মেথডের ওপর একটি নির্দিষ্ট আচরণ বা কল প্রত্যাশা করে এবং নিশ্চিত করে যে সেটি একাধিকবার কল হয় বা নির্দিষ্ট আর্গুমেন্ট নিয়ে কল হয়।
উদাহরণ: expect দিয়ে Mock করা
ধরা যাক, একটি Logger ক্লাস আছে, যার একটি log_message মেথড আছে, এবং আমরা চাই যে এই মেথডটি একটি নির্দিষ্ট বার্তা লগ করবে।
# logger.rb
class Logger
def log_message(message)
# লোগিং কার্যক্রম
puts message
end
endটেস্ট কোড:
# spec/logger_spec.rb
require './logger'
describe Logger do
it "mock করে log_message মেথডটি" do
logger = Logger.new
# মক করা: আমরা আশা করি যে log_message মেথডটি একটি নির্দিষ্ট আর্গুমেন্ট নিয়ে কল হবে
expect(logger).to receive(:log_message).with("Test message")
# log_message কল করা
logger.log_message("Test message")
end
endএখানে:
expect(logger).to receive(:log_message).with("Test message"): আমরা আশা করি যেlog_messageমেথডটি"Test message"আর্গুমেন্ট সহ কল হবে।- এই টেস্টটি নিশ্চিত করবে যে মেথডটি সঠিকভাবে কল হচ্ছে।
৩. allow এবং expect এর মধ্যে পার্থক্য
allow: মেথডটি একটি নির্দিষ্ট ফলাফল ফিরিয়ে দেবে, কিন্তু এটি কোন পরীক্ষা করবে না বা কোন নির্দিষ্ট আচরণ নিশ্চিত করবে না। এটি স্টাবিংয়ের জন্য ব্যবহৃত হয়।expect: মেথডটি একটি নির্দিষ্ট আচরণ বা কল হওয়ার প্রত্যাশা তৈরি করে এবং এটি নিশ্চিত করবে যে মেথডটি কল হয়েছে বা কল হয়নি।
allow এবং expect ব্যবহার পার্থক্য:
allow: মেথড স্টাব করে নির্দিষ্ট ফলাফল দেয়, কিন্তু এটি কল হওয়ার সংখ্যা বা আর্গুমেন্ট পরীক্ষা করে না।expect: মেথডটি একটি নির্দিষ্ট আর্গুমেন্ট নিয়ে কল হবে বা নির্দিষ্ট সময়ে কল হবে কিনা তা পরীক্ষা করে।
সারাংশ
- Mocks এবং Stubs RSpec-এ বাহ্যিক নির্ভরশীলতা বা সিস্টেম অনুকরণ করতে ব্যবহৃত হয়।
allowস্টাবিংয়ের জন্য ব্যবহার করা হয়, যা একটি মেথডকে পূর্বনির্ধারিত ফলাফল দেয়।expectমকিংয়ের জন্য ব্যবহার করা হয়, যা একটি নির্দিষ্ট আচরণ বা কল করার প্রত্যাশা করে।
এই দুইটি উপাদান RSpec-এ টেস্ট লেখার সময় ডিপেন্ডেন্সি মকিং এবং স্টাবিংয়ের জন্য গুরুত্বপূর্ণ ভূমিকা পালন করে।
Read more