Skill

RSpec Fakes এবং Spies (RSpec Fakes and Spies)

আরএসপেক (RSpec) - Computer Programming

261

RSpec এ Fakes এবং Spies দুটি শক্তিশালী টুল যা টেস্টিং প্রক্রিয়ায় মকিং এবং স্টাবিং এর মাধ্যমে আপনার কোডের নির্ভরশীলতা নিয়ন্ত্রণ করতে সাহায্য করে। এগুলো মূলত টেস্টের সময় আচরণের কাস্টমাইজেশন এবং ট্র্যাকিংয়ের জন্য ব্যবহৃত হয়।


১. RSpec Fakes

Fake হল একটি সরল বিকল্প বা মক অবজেক্ট যা একাধিক উদ্দেশ্যে ব্যবহার করা যায়। এটি সাধারণত পরীক্ষার সময় নির্দিষ্ট ফাংশন বা অবজেক্টের আচরণ পরিবর্তন করার জন্য ব্যবহৃত হয়।

ব্যবহার কৌশল:

Fake সাধারণত কোনো নির্দিষ্ট মেথডকে স্টাব (stub) বা রিপ্লেস (replace) করতে ব্যবহৃত হয়, যাতে আসল মেথডের পরিবর্তে মক ডেটা বা আচরণ ব্যবহার করা যায়।

উদাহরণ:

ধরা যাক, আপনার একটি User ক্লাস আছে, যেখানে একটি send_email মেথড রয়েছে যা ইমেইল পাঠায়। আমরা এখানে ফেইক ব্যবহার করতে পারি, যাতে ইমেইল পাঠানোর প্রকৃত কার্যকলাপ না হয়, কিন্তু মেথডটি সঠিকভাবে কল হচ্ছে কিনা যাচাই করা যায়।

class User
  def send_email
    # ইমেইল পাঠানোর কোড
  end
end

টেস্ট কেস:

describe User do
  it "ইমেইল পাঠায়" do
    user = User.new
    fake = double("FakeEmailService") # ফেইক অবজেক্ট তৈরি
    allow(user).to receive(:send_email).and_return(true) # send_email ফাংশনটি ফেইক করি

    result = user.send_email
    expect(result).to be true
  end
end

এই উদাহরণে, send_email মেথডটি ফেইক করা হয়েছে এবং আমরা নিশ্চিত করেছি যে এটি কল হচ্ছে এবং সঠিক ফলাফল প্রদান করছে।


২. RSpec Spies

Spy একটি ধরনের টুল যা টেস্ট চলাকালীন নির্দিষ্ট মেথড বা কলের আচরণ ট্র্যাক করে। স্পাই সাধারণত ব্যবহৃত হয় এটি পরীক্ষা করতে যে একটি মেথড ঠিকভাবে কল হয়েছে কিনা, তবে এটি মকিং বা স্টাবিংয়ের মতো আচরণ পরিবর্তন করে না।

ব্যবহার কৌশল:

স্পাইয়ের সাহায্যে আপনি শুধু মেথডের কল ট্র্যাক করতে পারেন এবং মেথডটি কতবার, কীভাবে কল হয়েছে তা পরীক্ষা করতে পারেন।

উদাহরণ:

ধরা যাক, User ক্লাসের একটি notify মেথড রয়েছে যা কাউকে নোটিফিকেশন পাঠায়। আমরা এখানে স্পাই ব্যবহার করে যাচাই করব যে এই মেথডটি কতবার কল হয়েছে।

class User
  def notify
    # নোটিফিকেশন পাঠানোর কোড
  end
end

টেস্ট কেস:

describe User do
  it "নোটিফিকেশন পাঠায়" do
    user = User.new
    spy = spy("SpyNotificationService") # স্পাই তৈরি করা

    allow(user).to receive(:notify).and_call_original # notify মেথড কল করতে দেওয়া
    user.notify

    expect(user).to have_received(:notify).once # এটি নিশ্চিত করতে হবে যে notify মেথড একবার কল হয়েছে
  end
end

এই উদাহরণে, notify মেথডটির কল ট্র্যাক করা হয়েছে এবং নিশ্চিত করা হয়েছে যে এটি একবার কল হয়েছে।


Fakes এবং Spies এর মধ্যে পার্থক্য

  1. Fake:
    • এটি একটি মক অবজেক্ট যা আসল কোডের আচরণ কাস্টমাইজ করে এবং টেস্টিং সময় মক ডেটা প্রদান করে।
    • এর মাধ্যমে মেথডের বাস্তব কার্যকারিতা পরিবর্তন করা যায় বা কাস্টম আচরণ যোগ করা যায়।
  2. Spy:
    • এটি শুধুমাত্র মেথডের কল ট্র্যাক করে, কিন্তু মেথডের বাস্তব কার্যকারিতা পরিবর্তন করে না।
    • স্পাই দিয়ে আপনি পরীক্ষা করতে পারেন যে একটি মেথড ঠিকভাবে কল হয়েছে কিনা এবং কতবার কল হয়েছে।

সারাংশ

RSpec Fakes এবং Spies দুইটি গুরুত্বপূর্ণ টুল যা RSpec টেস্টিং ফ্রেমওয়ার্কে ব্যবহৃত হয়। Fakes মেথড বা অবজেক্টের আচরণ পরিবর্তন করতে সাহায্য করে, এবং Spies মেথডের কল ট্র্যাক করতে ব্যবহৃত হয়। এগুলোর মাধ্যমে আপনি আপনার টেস্ট কোডকে আরও নির্ভরযোগ্য এবং কার্যকরী করতে পারেন।

Content added By

Fakes এবং Spies হল সফটওয়্যার টেস্টিং এর দুটি গুরুত্বপূর্ণ কৌশল, যেগুলি সাধারণত Mocking এবং Stubbing এর অংশ হিসেবে ব্যবহৃত হয়। এগুলি বিশেষ করে RSpec বা অন্যান্য টেস্টিং ফ্রেমওয়ার্কে ব্যবহৃত হয় যখন টেস্ট করার সময় নির্দিষ্ট ডিপেন্ডেন্সি বা বাহ্যিক সিস্টেমের উপর নির্ভরশীলতা কমাতে হয়। Fakes এবং Spies ডেভেলপারদের টেস্ট পরিবেশে কোডের নির্ভরশীলতাগুলি অনুকরণ (mock) করতে সহায়ক, যাতে মূল সিস্টেমের কার্যকারিতা থেকে বিভ্রান্তি এড়ানো যায়।


Fake কী?

Fake হলো একটি কাস্টম অবজেক্ট বা ক্লাস যা আসল সিস্টেমের আচরণ নকল করে, তবে কিছুটা সাধারণ বা কমপ্লেক্স হতে পারে। Fakes মূলত বাহ্যিক সিস্টেম বা ডিপেন্ডেন্সি (যেমন: ডাটাবেস, API) এর রিপ্লেসমেন্ট হিসেবে কাজ করে। এগুলি আসল সিস্টেমের তুলনায় সাধারণ, তবে কিছুক্ষেত্রে পুরোপুরি কার্যকরী।

Fake এর উদাহরণ:

ধরা যাক, আপনি একটি টেস্টে ডাটাবেসের পরিবর্তে একটি Fake ডাটাবেস ব্যবহার করতে চান। Fake ডাটাবেস আসল ডাটাবেসের মতই কাজ করে, তবে এটি সাধারণভাবে একটি ইন-মেমরি ডাটাবেস হতে পারে যা আসল ডাটাবেসের ডেটা প্রবাহ অনুকরণ করে।

class FakeDatabase
  def initialize
    @data = []
  end

  def save(record)
    @data << record
  end

  def find(id)
    @data.find { |record| record.id == id }
  end
end

এখানে FakeDatabase ক্লাসটি আসল ডাটাবেসের একটি সাধারণ প্রতিস্থাপন। এটি ডেটা সংরক্ষণ এবং খোঁজার জন্য একই ধরনের ইন্টারফেস প্রদান করে, তবে আসল ডাটাবেসের মতো কার্যকরী না হওয়া সত্ত্বেও এটি টেস্টের জন্য যথেষ্ট।

Spy কী?

Spy হল এমন একটি টেস্টিং কৌশল যা কোডের মধ্যে কোনো কার্যকলাপ ট্র্যাক করার জন্য ব্যবহৃত হয়। স্পাই সাধারণত method calls অথবা property accesses ট্র্যাক করে, এবং এটি জানিয়ে দেয় যে কোনো মেথড কল হয়েছে কিনা এবং কিভাবে সেটা ঘটেছে। এটি সাধারণত stubbing বা mocking এর সাথে ব্যবহৃত হয়, তবে এর মূল লক্ষ্য হল মেথডের কল বা ডেটার পরিবর্তন রেকর্ড করা।

Spy এর উদাহরণ:

একটি সাধারণ উদাহরণ হিসেবে, যদি আমাদের একটি টেস্টে নিশ্চিত করতে হয় যে একটি মেথড কল হয়েছে, তাহলে Spy ব্যবহার করা যেতে পারে:

class Calculator
  def add(a, b)
    result = a + b
    log(result) # আমরা এখানে log মেথড কল করতে চাই
    result
  end

  def log(value)
    puts "Logging: #{value}"
  end
end

describe Calculator do
  it "logs the result of add" do
    calculator = Calculator.new
    spy = spy("log")  # Spy object
    allow(calculator).to receive(:log).and_call_original  # Allow the log method to be called

    calculator.add(2, 3)

    expect(spy).to have_received(:log).with(5)  # Checking if the log method was called with 5
  end
end

এখানে:

  • spy("log") স্পাই হিসেবে ব্যবহৃত হয়েছে, যা log মেথডের কল ট্র্যাক করছে।
  • have_received(:log) ব্যবহার করে আমরা নিশ্চিত হচ্ছি যে log মেথডটি ৫ মানের সঙ্গে কল করা হয়েছে।

Fakes এবং Spies এর মধ্যে পার্থক্য

FeatureFakeSpy
Purposeআসল সিস্টেমের আচরণ নকল করা (মধ্যবর্তী সিস্টেম)মেথড কল এবং আর্গুমেন্ট ট্র্যাক করা
Usageডিপেন্ডেন্সি বা বাহ্যিক সিস্টেম রিপ্লেস করাএকটি মেথড কল হয়েছে কিনা তা যাচাই করা
Interactionকিছু কার্যক্রম সম্পাদন করতে সক্ষম (স্টাব বা ফাংশনাল)শুধুমাত্র কল ট্র্যাক করা (অ্যাক্সেস করা)
ExampleFake ডাটাবেস, Fake সার্ভারSpy মেথড কল, Spy মেসেজ/লগ
Complexityঅধিকাংশ সময় জটিল এবং বাস্তবতায় সম্পূর্ণ সমর্থন প্রদান করেসাধারণত মেথড কল ট্র্যাকিং এর জন্য সহজ

সারাংশ

Fakes এবং Spies টেস্টিংয়ে শক্তিশালী টুল যা টেস্টের সময় বাইরের সিস্টেমের উপর নির্ভরশীলতা কমায় এবং শুধুমাত্র সেই কার্যাবলী পরীক্ষা করতে সহায়ক হয় যা আপনাকে প্রয়োজন। Fakes আসল সিস্টেমের আচরণ অনুকরণ করে, যেখানে Spies মেথড কল বা কার্যকলাপ ট্র্যাক করে। Fakes সাধারণত কাস্টম সিস্টেম তৈরিতে ব্যবহার হয়, এবং Spies মেথড কলের ব্যবহার বা আচরণ যাচাই করতে ব্যবহৃত হয়।

Content added By

RSpec এ spy এবং double হল টেস্টিং-এর অংশ যা বাহ্যিক ডিপেন্ডেন্সি এবং মডিউল বা ক্লাসের আচরণ যাচাই করার জন্য ব্যবহৃত হয়। এগুলি Mocking এবং Stubbing কৌশলের অন্তর্গত এবং বিশেষত Unit Testing এবং Isolation Testing-এ গুরুত্বপূর্ণ ভূমিকা পালন করে।


1. Double

Double হল এমন একটি অবজেক্ট যা কোনও মেথড বা কনস্ট্রাক্টর কলকে সিমুলেট করে। এটি মূলত একটি fake object, যা কোনও নির্দিষ্ট আচরণ বা মেথডের আউটপুট নির্দিষ্টভাবে তৈরি করতে ব্যবহৃত হয়।

Double এর ব্যবহার:

  1. Stubbing: কোনও মেথড কলের আউটপুট নির্ধারণ করা।
  2. 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 এর ব্যবহার:

  1. Method Call Verification: এটি মেথড কল হয়েছে কিনা বা কতবার হয়েছে তা যাচাই করতে ব্যবহৃত হয়।
  2. 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 এর মধ্যে পার্থক্য

প্যারামিটারDoubleSpy
ব্যবহারকোনও মেথড বা ক্লাসের আচরণ সিমুলেট করেমেথড কল এবং স্টেট পরিবর্তন ট্র্যাক করে
মূল উদ্দেশ্যমেথডের আউটপুট স্টাব করা এবং একটি fake object তৈরি করামেথড কল যাচাই করা এবং রেকর্ড করা
মেথড কল ট্র্যাকিংনা, এটি মেথড স্টাবিং-এর জন্য ব্যবহৃত হয়হ্যাঁ, এটি মেথড কলের সংখ্যা এবং আর্গুমেন্ট ট্র্যাক করে
স্টেট ট্র্যাকিংনাহ্যাঁ, এটি অবজেক্টের স্টেট পরিবর্তনও ট্র্যাক করে
তৈরি করাdouble("ObjectName")spy("ObjectName")

কোথায় Double এবং Spy ব্যবহার করবেন

  • Double ব্যবহার করা উচিত যখন:
    • আপনি একটি বাহ্যিক ডিপেন্ডেন্সি বা অবজেক্টের আচরণ সিমুলেট করতে চান।
    • আপনি মেথডের আউটপুট স্টাব করতে চান, কিন্তু আপনি মেথড কলের উপর নজর রাখতে চান না।
  • Spy ব্যবহার করা উচিত যখন:
    • আপনি পরীক্ষা করতে চান যে কোনও মেথড কল করা হয়েছে কিনা, কতবার কল করা হয়েছে, এবং কী আর্গুমেন্ট ব্যবহার করা হয়েছে।
    • আপনি বাস্তব অবজেক্ট বা মেথডের উপর নজর রাখতে চান, কিন্তু সেই মেথডের আচরণ পরিবর্তন না করে।

সারাংশ

  • Double হল একটি ফেক অবজেক্ট যা স্টাবিং এবং ফাংশনালিটি সিমুলেট করতে ব্যবহৃত হয়।
  • Spy হল একটি বিশেষ ধরনের ফেক অবজেক্ট যা মেথড কল এবং স্টেট পরিবর্তন ট্র্যাক করে, এবং এটি ব্যবহৃত হয় মেথড কলের পরীক্ষার জন্য।
  • উভয়ই Mocking এবং Stubbing কৌশলের অংশ এবং Unit Testing-এ গুরুত্বপূর্ণ ভূমিকা পালন করে।
Content added By

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 ম্যাচার দিয়ে মেথড কলের আর্গুমেন্ট এবং ফ্রিকোয়েন্সি ট্র্যাক করতে পারেন। এই ফিচারগুলো টেস্টিংয়ের সময় বিশেষভাবে কার্যকরী, যখন আপনি নিশ্চিত করতে চান যে একটি নির্দিষ্ট মেথড সঠিক আর্গুমেন্টসহ সঠিক সময়ে কল হয়েছে কিনা।

Content added By

টেস্টিং এর সময়, বিশেষ করে Unit Testing বা Integration Testing এর ক্ষেত্রে, কিছু নির্দিষ্ট পরিস্থিতিতে Fakes এবং Spies ব্যবহৃত হয়। এগুলো সাধারণত মকিং (Mocking) এবং স্টাবিং (Stubbing) এর সমার্থক, কিন্তু কিছু বিশেষ কার্যকারিতা ও ভূমিকা থাকে যা ফেকস এবং স্পাইজকে ইউনিক এবং গুরুত্বপূর্ণ করে তোলে। এগুলোর ব্যবহার টেস্টিং প্রক্রিয়াকে আরও কার্যকর এবং নির্ভুল করে তোলে। নিচে এই টুলগুলোর প্রয়োজনীয়তা ও ব্যবহারের উপকারিতা আলোচনা করা হলো।


১. Fakes (ফেকস)

Fake হল একটি অবজেক্ট বা মডিউল যা মূল অবজেক্ট বা সিস্টেমের সরল প্রতিস্থাপন হিসেবে কাজ করে। ফেকের মধ্যে সাধারণত একটি অল্প ফাংশনালিটি থাকে, কিন্তু এটি আসল সিস্টেমের মতো আচরণ করে এবং কার্যকরভাবে টেস্টে ব্যবহৃত হয়। এটি মূলত নির্দিষ্ট ডিপেন্ডেন্সি বা বাহ্যিক সিস্টেমের জন্য ব্যবহৃত হয় যেগুলো পুরোপুরি পরীক্ষায় অন্তর্ভুক্ত করা সম্ভব নয় বা যা মূল কোডের জন্য অনুপযুক্ত হতে পারে।

ফেকস এর প্রয়োজনীয়তা:

  • বাহ্যিক নির্ভরশীলতাগুলির পরিবর্তে ব্যবহার: ফেকস ব্যবহার করা হয় যখন বাহ্যিক সিস্টেম বা ডেটাবেসের সাথে ইন্টারঅ্যাকশন করতে হয়, কিন্তু পুরো সিস্টেমটি পরীক্ষা করা উচিত নয়। উদাহরণস্বরূপ, যদি আপনার অ্যাপ্লিকেশন একটি তৃতীয় পক্ষের API কল করে, তাহলে আপনি সেই API-এর একটি ফেক তৈরি করে সেটা টেস্টে ব্যবহার করতে পারেন।
  • কাস্টম অবজেক্ট তৈরি: ফেকস সাধারণত ছোট এবং সহজ অবজেক্ট তৈরি করতে ব্যবহৃত হয়, যা বড় এবং জটিল প্রকল্পের ক্ষেত্রে কার্যকরী।

উদাহরণ:

class FakePaymentGateway
  def process_payment(amount)
    # ফেক পেমেন্ট প্রসেসিং, এখানে আসল API কল করা হয় না।
    true
  end
end

এখানে, FakePaymentGateway একটি সিম্পল ফেক ক্লাস যা আসল পেমেন্ট গেটওয়ের পরিবর্তে ব্যবহৃত হতে পারে টেস্টে।


২. Spies (স্পাইজ)

Spy হল এমন একটি অবজেক্ট যা টেস্ট চলাকালীন মেথড কল বা ফাংশন কল ট্র্যাক করার জন্য ব্যবহৃত হয়। এটি মূলত কোনও মেথড বা ফাংশনের কল লগ রাখে এবং নিশ্চিত করে যে সেটি সঠিকভাবে ট্রিগার হয়েছে কিনা, অথবা সঠিক আর্গুমেন্টের সাথে কল করা হয়েছে কিনা। স্পাইজ মূলত বাহ্যিক কার্যকলাপ অথবা ফাংশন কলস পর্যবেক্ষণ করতে ব্যবহৃত হয়, যা নিশ্চিত করে যে নির্দিষ্ট মেথড বা অ্যাকশন সঠিকভাবে কার্যকর হয়েছে।

স্পাইজ এর প্রয়োজনীয়তা:

  • ফাংশন কল ট্র্যাকিং: স্পাইজ ব্যবহার করা হয় যখন আপনি পরীক্ষা করতে চান যে কোনো ফাংশন বা মেথড সঠিকভাবে কল হয়েছে কিনা। এটি নিশ্চিত করতে সহায়ক যে একটি নির্দিষ্ট ক্রিয়া (যেমন, একটি মেথড কল বা ইভেন্ট ট্রিগার) ঘটেছে বা হয়নি।
  • কোডের অবস্থা যাচাই করা: স্পাইজ ব্যবহার করে আপনি নিশ্চিত করতে পারেন যে কোনো নির্দিষ্ট অবজেক্টের উপর কার্যকরী মেথড কল করা হয়েছে।

উদাহরণ:

class User
  def notify_admin
    AdminNotifier.send_email("admin@example.com")
  end
end

describe User do
  it "notifies the admin" do
    spy = spy('AdminNotifier')
    allow(AdminNotifier).to receive(:send_email).and_return(true)
    spy.notify_admin
    expect(spy).to have_received(:send_email).with("admin@example.com")
  end
end

এখানে spy দ্বারা আমরা AdminNotifier এর send_email মেথড কল ট্র্যাক করছি এবং নিশ্চিত হচ্ছি যে সঠিক আর্গুমেন্টের সাথে সেটি কল হয়েছে।


৩. Fakes এবং Spies এর মধ্যে পার্থক্য

ফিচারFakesSpies
প্রধান উদ্দেশ্যবাহ্যিক নির্ভরশীলতা বা সিস্টেমের প্রতিস্থাপন করামেথড বা ফাংশন কল ট্র্যাক করা
ব্যবহার ক্ষেত্রডিপেন্ডেন্সি বা বাহ্যিক সিস্টেম (যেমন ডেটাবেস, API) পরীক্ষা করামেথড কল এবং কার্যকলাপ নিশ্চিত করা
কোডের পরিবর্তনমূল কোডের কার্যকারিতা সিমুলেট করেকার্যকলাপ ট্র্যাক করার জন্য কাজ করে
কোন ডেটা ফেরত দেয়?ফেকস সাধারণত নির্দিষ্টভাবে তৈরি ডেটা ফেরত দেয়স্পাইজ শুধুমাত্র মেথড কল ট্র্যাক করে, ফলাফল নয়

৪. Fakes এবং Spies এর ব্যবহারিক উদাহরণ

Fake Example:

যেমন একটি ফেক ডেটাবেস:

class FakeDatabase
  def find_user_by_email(email)
    # ডাটাবেসের মূল কাজের পরিবর্তে এটি একটি সরল ফেক ডেটা ফেরত দেয়।
    { email: email, name: "John Doe" }
  end
end

এটি মূল ডেটাবেস অবজেক্টের একটি সরল ফেক। মূল ডেটাবেসের কাজটি না করে, এটি কেবল মক ডেটা সরবরাহ করে যা টেস্টের জন্য ব্যবহার করা হয়।

Spy Example:

যেমন একটি স্পাই ব্যবহার করে ফাংশন কল পরীক্ষা:

class EmailSender
  def send_welcome_email(user)
    # মেইল পাঠানোর লজিক
    puts "Sending email to #{user.email}"
  end
end

describe EmailSender do
  it "calls send_welcome_email with the correct argument" do
    spy = spy('EmailSender')
    user = double('User', email: 'user@example.com')
    
    spy.send_welcome_email(user)
    expect(spy).to have_received(:send_welcome_email).with(user)
  end
end

এখানে, স্পাই ব্যবহার করে send_welcome_email মেথড কল ট্র্যাক করা হয়েছে, এবং এটি নিশ্চিত করা হয়েছে যে এটি সঠিক আর্গুমেন্টের সাথে কল হয়েছে।


সারাংশ

Fakes এবং Spies টেস্টিং এর জন্য খুবই গুরুত্বপূর্ণ টুল, যা বিশেষভাবে কোডের নির্ভুলতা নিশ্চিত করতে ব্যবহৃত হয়:

  • Fakes ব্যবহার করা হয় যখন বাহ্যিক নির্ভরশীলতা বা সিস্টেম (যেমন, ডেটাবেস, API) পরীক্ষা করা হয়।
  • Spies ব্যবহার করা হয় মেথড কল পর্যবেক্ষণ করতে, এটি নিশ্চিত করার জন্য যে কোড সঠিকভাবে কার্যকর হচ্ছে।

এই টুলগুলো Unit Testing এবং Integration Testing প্রক্রিয়াকে আরও দক্ষ এবং নির্ভুল করতে সাহায্য করে।

Content added By
Promotion

Are you sure to start over?

Loading...