RSpec এ spy এবং double হল টেস্টিং-এর অংশ যা বাহ্যিক ডিপেন্ডেন্সি এবং মডিউল বা ক্লাসের আচরণ যাচাই করার জন্য ব্যবহৃত হয়। এগুলি Mocking এবং Stubbing কৌশলের অন্তর্গত এবং বিশেষত Unit Testing এবং Isolation Testing-এ গুরুত্বপূর্ণ ভূমিকা পালন করে।
1. Double
Double হল এমন একটি অবজেক্ট যা কোনও মেথড বা কনস্ট্রাক্টর কলকে সিমুলেট করে। এটি মূলত একটি fake object, যা কোনও নির্দিষ্ট আচরণ বা মেথডের আউটপুট নির্দিষ্টভাবে তৈরি করতে ব্যবহৃত হয়।
Double এর ব্যবহার:
- Stubbing: কোনও মেথড কলের আউটপুট নির্ধারণ করা।
- Behavior Verification: মেথডটি একটি নির্দিষ্ট আচরণ অনুসরণ করছে কিনা তা যাচাই করা।
উদাহরণ:
ধরা যাক, আপনার একটি Order মডেল আছে যা একটি PaymentGateway ক্লাস ব্যবহার করে পেমেন্ট প্রক্রিয়া করতে:
class Order
def initialize(payment_gateway)
@payment_gateway = payment_gateway
end
def process_payment(amount)
@payment_gateway.charge(amount)
end
endএখন, আপনি PaymentGateway ক্লাসের জন্য একটি double ব্যবহার করতে পারেন, যাতে আপনি তার আচরণ পরীক্ষা করতে পারেন, তবে আসল পেমেন্ট গেটওয়ের কার্যকারিতা চালনা করবেন না:
RSpec.describe Order do
it "processes payment correctly" do
# Double তৈরি করা হয়েছে PaymentGateway এর জন্য
payment_gateway_double = double("PaymentGateway")
# PaymentGateway.double এর charge মেথডে স্টাব করা হয়েছে
allow(payment_gateway_double).to receive(:charge).with(100).and_return(true)
order = Order.new(payment_gateway_double)
# Order-এ পেমেন্ট প্রসেস করা হচ্ছে এবং charge মেথডটি পরীক্ষা করা হচ্ছে
expect(order.process_payment(100)).to eq(true)
# charge মেথডটি সত্যি কার্যকর হয়েছে কিনা তা নিশ্চিত করা হচ্ছে
expect(payment_gateway_double).to have_received(:charge).with(100)
end
endএখানে:
- double("PaymentGateway"): এটি একটি fake object তৈরি করেছে যা
PaymentGatewayক্লাসের মত আচরণ করবে। - allow(payment_gateway_double).to receive(:charge): আমরা
chargeমেথডকে স্টাব করেছি, যাতে এটি 100 পেমেন্ট পাওয়ার পরtrueরিটার্ন করে।
2. Spy
Spy হল একটি বিশেষ ধরনের double যা বাস্তবিক মেথড কলগুলির উপর নজর রাখে। এটি method calls বা state পরিবর্তনগুলিকে ট্র্যাক করে, এবং টেস্ট শেষে যাচাই করা যায় মেথডটি ঠিকভাবে কল করা হয়েছে কিনা।
Spy এর ব্যবহার:
- Method Call Verification: এটি মেথড কল হয়েছে কিনা বা কতবার হয়েছে তা যাচাই করতে ব্যবহৃত হয়।
- State Verification: এটি স্টেট পরিবর্তন করেছে কিনা যাচাই করতে ব্যবহৃত হয়।
উদাহরণ:
ধরা যাক, আপনার একটি UserNotifier ক্লাস আছে যা একটি ইমেইল পাঠানোর কাজ করে, এবং আপনি নিশ্চিত করতে চান যে send_email মেথডটি একাধিক বার কল হয়েছে:
class UserNotifier
def send_email(user)
# ইমেইল পাঠানোর লজিক
end
endএখন, আপনি এই মেথডের উপর spy ব্যবহার করতে পারেন:
RSpec.describe UserNotifier do
it "calls send_email once" do
user_notifier = spy("UserNotifier")
# Spy করে send_email মেথডে কল করা
user_notifier.send_email("user@example.com")
# মেথডটি একবার কল হয়েছে কিনা যাচাই
expect(user_notifier).to have_received(:send_email).with("user@example.com")
end
endএখানে:
- spy("UserNotifier"): এটি একটি spy object তৈরি করেছে, যা
UserNotifierক্লাসের আচরণ নকল করে এবং মেথড কলের জন্য নজর রাখে। - have_received(:send_email): এটি যাচাই করবে যে
send_emailমেথডটি সঠিকভাবে কল হয়েছে কিনা এবং কী আর্গুমেন্টের সাথে।
Double এবং Spy এর মধ্যে পার্থক্য
| প্যারামিটার | Double | Spy |
|---|---|---|
| ব্যবহার | কোনও মেথড বা ক্লাসের আচরণ সিমুলেট করে | মেথড কল এবং স্টেট পরিবর্তন ট্র্যাক করে |
| মূল উদ্দেশ্য | মেথডের আউটপুট স্টাব করা এবং একটি fake object তৈরি করা | মেথড কল যাচাই করা এবং রেকর্ড করা |
| মেথড কল ট্র্যাকিং | না, এটি মেথড স্টাবিং-এর জন্য ব্যবহৃত হয় | হ্যাঁ, এটি মেথড কলের সংখ্যা এবং আর্গুমেন্ট ট্র্যাক করে |
| স্টেট ট্র্যাকিং | না | হ্যাঁ, এটি অবজেক্টের স্টেট পরিবর্তনও ট্র্যাক করে |
| তৈরি করা | double("ObjectName") | spy("ObjectName") |
কোথায় Double এবং Spy ব্যবহার করবেন
- Double ব্যবহার করা উচিত যখন:
- আপনি একটি বাহ্যিক ডিপেন্ডেন্সি বা অবজেক্টের আচরণ সিমুলেট করতে চান।
- আপনি মেথডের আউটপুট স্টাব করতে চান, কিন্তু আপনি মেথড কলের উপর নজর রাখতে চান না।
- Spy ব্যবহার করা উচিত যখন:
- আপনি পরীক্ষা করতে চান যে কোনও মেথড কল করা হয়েছে কিনা, কতবার কল করা হয়েছে, এবং কী আর্গুমেন্ট ব্যবহার করা হয়েছে।
- আপনি বাস্তব অবজেক্ট বা মেথডের উপর নজর রাখতে চান, কিন্তু সেই মেথডের আচরণ পরিবর্তন না করে।
সারাংশ
- Double হল একটি ফেক অবজেক্ট যা স্টাবিং এবং ফাংশনালিটি সিমুলেট করতে ব্যবহৃত হয়।
- Spy হল একটি বিশেষ ধরনের ফেক অবজেক্ট যা মেথড কল এবং স্টেট পরিবর্তন ট্র্যাক করে, এবং এটি ব্যবহৃত হয় মেথড কলের পরীক্ষার জন্য।
- উভয়ই Mocking এবং Stubbing কৌশলের অংশ এবং Unit Testing-এ গুরুত্বপূর্ণ ভূমিকা পালন করে।
Read more