RSpec-এ Method Call এবং Arguments ট্র্যাক করা একটি গুরুত্বপূর্ণ কাজ, যা বিশেষত মকিং এবং স্পাইং এর মাধ্যমে কোডের আচরণ পরীক্ষা করতে ব্যবহৃত হয়। RSpec-এ মক অবজেক্টের মাধ্যমে আপনি নির্দিষ্ট মেথড কলগুলো এবং সেই কলগুলোর আর্গুমেন্টগুলো ট্র্যাক করতে পারেন। এর মাধ্যমে আপনি নিশ্চিত করতে পারেন যে কোন মেথডটি কবে এবং কিভাবে কল হয়েছে এবং সেই কলের আর্গুমেন্টগুলি সঠিক ছিল কিনা।
১. Method Call Tracking (Method Call ট্র্যাক করা)
RSpec-এ মক অবজেক্ট ব্যবহার করলে আপনি খুব সহজে মেথড কল ট্র্যাক করতে পারেন। এটি এমন একটি অবজেক্ট যা নির্দিষ্ট মেথড কলের আচরণ সিমুলেট করে এবং সেই কলের তথ্য সংগ্রহ করে।
উদাহরণ:
ধরা যাক, আমাদের একটি Calculator ক্লাস আছে, যার মধ্যে একটি add মেথড আছে, যা দুটি সংখ্যার যোগফল দেয়।
class Calculator
def add(a, b)
a + b
end
endএখন, আমরা চাই যে add মেথডটি কখন এবং কিভাবে কল হচ্ছে তা ট্র্যাক করি। আমরা মক অবজেক্ট ব্যবহার করে এটি করতে পারি:
# spec/calculator_spec.rb
require 'rails_helper'
RSpec.describe Calculator, type: :model do
it "tracks method calls" do
calculator = double("Calculator") # Mock object তৈরি
allow(calculator).to receive(:add) # add মেথড মক করা
calculator.add(2, 3) # মেথড কল
expect(calculator).to have_received(:add).with(2, 3) # মেথড কল ট্র্যাক করা
end
endএখানে, আমরা double("Calculator") ব্যবহার করে একটি মক অবজেক্ট তৈরি করেছি এবং তারপর allow(calculator).to receive(:add) ব্যবহার করে add মেথডকে মক করেছি। এরপর, have_received(:add).with(2, 3) দিয়ে চেক করেছি যে, add মেথডটি সত্যিই ২ এবং ৩ আর্গুমেন্ট সহ কল হয়েছে কিনা।
টেস্ট রান:
rspecএই টেস্টটি নিশ্চিত করবে যে add মেথডটি কল করা হয়েছে এবং সঠিক আর্গুমেন্টসহ কল হয়েছে।
২. Arguments Tracking (Arguments ট্র্যাক করা)
have_received ম্যাচার ব্যবহারের মাধ্যমে আপনি মেথড কলের আর্গুমেন্টগুলোও ট্র্যাক করতে পারেন। এটি বিশেষভাবে ব্যবহারী যখন আপনি যাচাই করতে চান যে মেথড কল সঠিক আর্গুমেন্ট সহ হয়েছে কিনা।
উদাহরণ:
ধরা যাক, আমাদের একটি Notifier ক্লাস আছে, যা একটি মেসেজ পাঠায়:
class Notifier
def send_message(user, message)
# কিছু কোড
end
endএখন, আমরা চাই যে send_message মেথডটি সঠিক আর্গুমেন্টের সাথে কল হয়েছে কিনা তা ট্র্যাক করতে।
# spec/notifier_spec.rb
require 'rails_helper'
RSpec.describe Notifier, type: :model do
it "tracks method arguments" do
notifier = double("Notifier")
allow(notifier).to receive(:send_message)
notifier.send_message("John", "Hello, John!") # মেথড কল
expect(notifier).to have_received(:send_message).with("John", "Hello, John!") # আর্গুমেন্ট চেক
end
endএখানে, আমরা মক অবজেক্টে send_message মেথড কলের আর্গুমেন্ট "John" এবং "Hello, John!" যাচাই করছি।
টেস্ট রান:
rspecএই টেস্টটি নিশ্চিত করবে যে send_message মেথডটি সঠিক আর্গুমেন্টের সাথে কল হয়েছে।
৩. Method Call Counting (মেথড কল গোনা)
কখনও কখনও আপনি চান যে একটি নির্দিষ্ট মেথডটি কতবার কল হয়েছে তা গুনে বের করতে। এটি count ম্যাচারের মাধ্যমে করা যায়।
উদাহরণ:
# spec/counter_spec.rb
require 'rails_helper'
RSpec.describe Calculator, type: :model do
it "counts method calls" do
calculator = double("Calculator")
allow(calculator).to receive(:add)
calculator.add(1, 2)
calculator.add(3, 4)
expect(calculator).to have_received(:add).twice # মেথডটি দুইবার কল হয়েছে কিনা চেক করা
end
endএখানে, twice ম্যাচারটি ব্যবহার করা হয়েছে, যা নিশ্চিত করবে যে add মেথডটি দুইবার কল হয়েছে।
৪. স্পাই (Spy) ব্যবহার করা
স্পাই হল এমন একটি উপকরণ যা মূলত একটি মক অবজেক্টের মতো কাজ করে কিন্তু এটি আসল অবজেক্টের আচরণও বাস্তবায়ন করে। স্পাই ব্যবহার করে আপনি মেথড কল এবং আর্গুমেন্ট ট্র্যাক করার পাশাপাশি সেই মেথডের আসল কার্যকরিতা (যেমন মেথডের আউটপুট) দেখতে পারেন।
# spec/calculator_spec.rb
require 'rails_helper'
RSpec.describe Calculator, type: :model do
it "tracks method calls with spy" do
calculator = Calculator.new
spy_calculator = spy("Calculator", add: calculator.add(2, 3)) # স্পাই অবজেক্ট
spy_calculator.add(2, 3)
expect(spy_calculator).to have_received(:add).with(2, 3) # আর্গুমেন্ট যাচাই
end
endএখানে, spy ব্যবহার করা হয়েছে এবং মেথড কল এবং আর্গুমেন্ট ট্র্যাক করা হয়েছে।
সারাংশ
RSpec-এ Method Call এবং Arguments ট্র্যাক করার জন্য মক অবজেক্ট এবং স্পাই ব্যবহার করা হয়। আপনি have_received ম্যাচার দিয়ে মেথড কলের আর্গুমেন্ট এবং ফ্রিকোয়েন্সি ট্র্যাক করতে পারেন। এই ফিচারগুলো টেস্টিংয়ের সময় বিশেষভাবে কার্যকরী, যখন আপনি নিশ্চিত করতে চান যে একটি নির্দিষ্ট মেথড সঠিক আর্গুমেন্টসহ সঠিক সময়ে কল হয়েছে কিনা।
Read more