RSpec-এর মাধ্যমে আপনি মেথড কল এবং রিটার্ন ভ্যালু manipulate (পরিবর্তন) করতে পারেন। এর জন্য আপনি মকিং (Mocking) এবং স্পাইং (Spying) ব্যবহার করতে পারেন, যা কোনো নির্দিষ্ট মেথড বা তার রিটার্ন ভ্যালু পরীক্ষা করার জন্য খুবই কার্যকরী।
১. মকিং (Mocking)
মকিং এর মাধ্যমে, আপনি বাস্তব মেথডের পরিবর্তে মক অবজেক্ট তৈরি করতে পারেন এবং সেই অবজেক্টের মাধ্যমে মেথড কল করতে পারেন। এটি একধরনের টেস্ট ডাবল।
উদাহরণ:
ধরা যাক, আমাদের একটি Order ক্লাস রয়েছে এবং send_email মেথডটি একটি ইমেইল পাঠানোর কাজ করে।
class Order
def send_email
# এখানে ইমেইল পাঠানোর কোড থাকবে
"ইমেইল পাঠানো হয়েছে"
end
endএখন আমরা যদি মকিং ব্যবহার করতে চাই, তাহলে:
describe Order do
it "ইমেইল পাঠানোর জন্য মকিং ব্যবহার করবে" do
order = double("Order") # মক অবজেক্ট তৈরি
allow(order).to receive(:send_email).and_return("ইমেইল পাঠানো হয়েছে") # মক মেথডের রিটার্ন ভ্যালু
expect(order.send_email).to eq("ইমেইল পাঠানো হয়েছে")
end
endএখানে double("Order") মক অবজেক্ট তৈরি করেছে এবং allow(order).to receive(:send_email).and_return("ইমেইল পাঠানো হয়েছে") মেথড কলের রিটার্ন ভ্যালু কাস্টমাইজ করে দিয়েছে।
২. স্পাইং (Spying)
স্পাইং হলো মকিংয়ের মতোই, তবে এটি মেথডটি আসলেই কল হবে কিনা এবং তার রিটার্ন ভ্যালু কী হবে তা পরীক্ষার জন্য ব্যবহার করা হয়। এতে আপনি মেথডটির সাইড ইফেক্ট দেখতে পারেন।
উদাহরণ:
ধরা যাক, আমাদের আবার Order ক্লাস রয়েছে এবং send_email মেথডটি একটি ইমেইল পাঠানোর কাজ করে।
class Order
def send_email
"ইমেইল পাঠানো হয়েছে"
end
endএখন যদি আপনি একটি স্পাই ব্যবহার করেন:
describe Order do
it "ইমেইল পাঠানোর মেথড কল হয়েছে কিনা তা পরীক্ষা করবে" do
order = Order.new
spy_order = spy("Order", send_email: "ইমেইল পাঠানো হয়েছে") # স্পাই তৈরি
expect(spy_order.send_email).to eq("ইমেইল পাঠানো হয়েছে")
expect(spy_order).to have_received(:send_email) # মেথড কল হয়েছে কিনা তা পরীক্ষা
end
endএখানে, spy মক অবজেক্ট তৈরি করেছে যা send_email মেথড কলের রিটার্ন ভ্যালু স্পেসিফাই করে এবং পরে have_received(:send_email) দিয়ে যাচাই করে যে মেথডটি কল হয়েছে কিনা।
৩. মেথডের রিটার্ন ভ্যালু কাস্টমাইজ করা
RSpec এ আপনি মেথডের রিটার্ন ভ্যালু কাস্টমাইজও করতে পারেন। এর মাধ্যমে আপনি মেথডের কার্যকারিতা বা আউটপুট নিয়ন্ত্রণ করতে পারেন।
উদাহরণ:
ধরা যাক, একটি Discount ক্লাস রয়েছে যা একটি ডিসকাউন্ট রেট দেয়:
class Discount
def rate
10 # ডিসকাউন্ট রেট
end
endএখন আপনি যদি rate মেথডের রিটার্ন ভ্যালু কাস্টমাইজ করতে চান:
describe Discount do
it "ডিসকাউন্ট রেট পরিবর্তন করবে" do
discount = double("Discount")
allow(discount).to receive(:rate).and_return(20) # রিটার্ন ভ্যালু কাস্টমাইজ
expect(discount.rate).to eq(20)
end
endএখানে, allow(discount).to receive(:rate).and_return(20) দিয়ে rate মেথডের রিটার্ন ভ্যালু কাস্টমাইজ করা হয়েছে।
৪. মেথডের রিটার্ন ভ্যালু এবং আর্গুমেন্ট চেক করা
RSpec এ আপনি মেথডের রিটার্ন ভ্যালু এবং আর্গুমেন্টও চেক করতে পারেন, যাতে নিশ্চিত হতে পারেন মেথডটি সঠিকভাবে কাজ করছে।
উদাহরণ:
ধরা যাক, আমাদের একটি Calculator ক্লাস রয়েছে, যা দুটি সংখ্যার যোগফল দেয়:
class Calculator
def add(a, b)
a + b
end
endএখন, যদি আপনি নিশ্চিত হতে চান যে, add মেথডটি সঠিক আর্গুমেন্ট নিয়ে কল হচ্ছে:
describe Calculator do
it "দুটি সংখ্যা যোগফল সঠিকভাবে বের করে" do
calculator = Calculator.new
allow(calculator).to receive(:add).with(2, 3).and_return(5)
expect(calculator.add(2, 3)).to eq(5) # আর্গুমেন্ট চেক
end
endএখানে, with(2, 3) দ্বারা আর্গুমেন্টগুলো চেক করা হচ্ছে এবং and_return(5) দিয়ে রিটার্ন ভ্যালু কাস্টমাইজ করা হয়েছে।
সারাংশ
RSpec এ মেথড কল এবং রিটার্ন ভ্যালু manipulate করার জন্য মকিং এবং স্পাইিং দুটি শক্তিশালী টুল। মকিংয়ের মাধ্যমে আপনি মেথড বা ক্লাসের আচরণ বদলাতে পারেন, এবং স্পাইিংয়ের মাধ্যমে মেথড কলের কার্যকারিতা যাচাই করতে পারেন। এই দুটি পদ্ধতি ব্যবহার করে আপনি আপনার কোডের সঠিকতা যাচাই করার পাশাপাশি তার আচরণ নিয়ন্ত্রণও করতে পারবেন।
Read more