Advanced Matchers (অ্যাডভান্সড ম্যাচারস)

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

320

RSpec এ ম্যাচার্স হলো এমন পদ্ধতি যা টেস্টে আসা ফলাফলের সাথে তুলনা করে এবং পরীক্ষিত ফলাফল মেলানোর জন্য ব্যবহৃত হয়। সাধারণত, expect(...).to অথবা expect(...).not_to দিয়ে ম্যাচারের মাধ্যমে পরীক্ষাগুলি করা হয়। কিন্তু RSpec আরো কিছু এডভান্সড ম্যাচার্স প্রদান করে যা আপনাকে আরো শক্তিশালী এবং বিস্তারিত পরীক্ষা পরিচালনা করতে সহায়ক হয়।


১. change Matcher

change ম্যাচারটি ব্যবহার করে আপনি কোনো একটি পদ্ধতির বা ভ্যারিয়েবলের মানের পরিবর্তন পরীক্ষা করতে পারেন।

উদাহরণ:

ধরা যাক, আমাদের একটি BankAccount ক্লাস রয়েছে যেখানে balance ভ্যারিয়েবলটি আপডেট হয়।

class BankAccount
  attr_accessor :balance

  def initialize
    @balance = 0
  end

  def deposit(amount)
    @balance += amount
  end
end

এখন আপনি deposit মেথড কল করার পর balance এর পরিবর্তন পরীক্ষা করতে পারেন:

describe BankAccount do
  it "পরিমাণ জমা হলে ব্যালেন্স পরিবর্তন হবে" do
    account = BankAccount.new

    expect { account.deposit(100) }.to change { account.balance }.by(100)
  end
end

এখানে, change { account.balance } চেক করবে যে balance এর মান 100 বাড়ছে কিনা।


২. be_within Matcher

be_within ম্যাচারটি সাধারণত নম্বরের মধ্যে একটি নির্দিষ্ট সীমা বা পরিসরের মধ্যে পরীক্ষা করতে ব্যবহৃত হয়। এটি একটি মার্জিন সহ মানের পরীক্ষা করে।

উদাহরণ:

ধরা যাক, আপনি পরীক্ষা করতে চান যে কোনো মেথড কিছু মান ফিরিয়ে দেয় যা নির্দিষ্ট পরিসরের মধ্যে পড়ে:

describe "Math operations" do
  it "দ্বিতীয় সংখ্যার সাথে যোগফল একটি নির্দিষ্ট সীমার মধ্যে থাকবে" do
    result = 5 + 7.4

    expect(result).to be_within(0.5).of(12)  # ফলাফল 12 এর মধ্যে 0.5 মাপের সীমানায় থাকা উচিত
  end
end

এখানে be_within(0.5).of(12) নিশ্চিত করবে যে ফলাফল 12 এর 0.5 পরিসরের মধ্যে আছে।


৩. satisfy Matcher

satisfy ম্যাচারটি একটি কাস্টম শর্ত পরীক্ষা করতে ব্যবহার করা হয়, যা পূর্বনির্ধারিত ম্যাচার ব্যবহার না করে আপনার নিজের শর্তে টেস্ট পরিচালনা করতে সাহায্য করে।

উদাহরণ:

ধরা যাক, একটি is_prime? মেথড পরীক্ষা করতে চান, যা একটি সংখ্যা প্রাইম কিনা তা পরীক্ষা করে:

describe "Prime number checker" do
  it "সংখ্যা প্রাইম কিনা তা সঠিকভাবে পরীক্ষা করবে" do
    expect(7).to satisfy { |n| n > 1 && (2..Math.sqrt(n)).none? { |i| n % i == 0 } }
  end
end

এখানে satisfy ম্যাচারটি ব্যবহার করা হয়েছে এবং একটি ব্লক প্রদান করা হয়েছে যা টেস্টের শর্ত যাচাই করবে (যে সংখ্যাটি প্রাইম কিনা)।


৪. have_attributes Matcher

have_attributes ম্যাচারটি একটি অবজেক্টের অ্যাট্রিবিউটের মান পরীক্ষা করতে ব্যবহৃত হয়।

উদাহরণ:

ধরা যাক, একটি Person ক্লাস আছে যার name এবং age অ্যাট্রিবিউট আছে:

class Person
  attr_accessor :name, :age

  def initialize(name, age)
    @name = name
    @age = age
  end
end

এখন আপনি have_attributes ব্যবহার করে পরীক্ষা করতে পারেন যে name এবং age অ্যাট্রিবিউটগুলি সঠিকভাবে সেট করা হয়েছে কিনা:

describe Person do
  it "সঠিক নাম এবং বয়স সহ একটি অবজেক্ট তৈরি হবে" do
    person = Person.new("John", 25)

    expect(person).to have_attributes(name: "John", age: 25)
  end
end

এখানে have_attributes(name: "John", age: 25) নিশ্চিত করবে যে person অবজেক্টের name এবং age সঠিক মানে আছে।


৫. include Matcher

include ম্যাচারটি ব্যবহার করে আপনি একটি অ্যারে বা স্ট্রিং এর মধ্যে নির্দিষ্ট মান বা উপাদান উপস্থিত আছে কিনা তা পরীক্ষা করতে পারেন।

উদাহরণ:

describe "Array" do
  it "অ্যারে নির্দিষ্ট মান অন্তর্ভুক্ত করে" do
    arr = [1, 2, 3, 4]

    expect(arr).to include(2)  # অ্যারে 2 অন্তর্ভুক্ত কিনা পরীক্ষা
  end
end

এখানে include(2) চেক করবে যে অ্যারেটি 2 উপাদানটি অন্তর্ভুক্ত করছে কিনা।


৬. respond_to Matcher

respond_to ম্যাচারটি ব্যবহার করে আপনি একটি অবজেক্টের কোনো মেথড বা অ্যাট্রিবিউটের উপস্থিতি পরীক্ষা করতে পারেন।

উদাহরণ:

describe String do
  it "length মেথডের প্রতি সাড়া দেয়" do
    str = "Hello"
    
    expect(str).to respond_to(:length)  # `str` অবজেক্টে `length` মেথড থাকা উচিত
  end
end

এখানে respond_to(:length) চেক করবে যে str অবজেক্টটি length মেথডের প্রতি সাড়া দেয় কিনা।


সারাংশ

RSpec এ এডভান্সড ম্যাচার্স ব্যবহার করে আপনি আরো শক্তিশালী এবং বিস্তারিত টেস্ট করতে পারেন। এর মাধ্যমে আপনি কোডের আচরণ যাচাই করতে পারেন, যেমন:

  • change: মানের পরিবর্তন পরীক্ষা করা,
  • be_within: নির্দিষ্ট সীমার মধ্যে মান পরীক্ষা করা,
  • satisfy: কাস্টম শর্ত যাচাই করা,
  • have_attributes: অবজেক্টের অ্যাট্রিবিউট পরীক্ষা করা,
  • include: অ্যারে বা স্ট্রিংয়ের মধ্যে উপাদান উপস্থিতি পরীক্ষা করা,
  • respond_to: মেথডের উপস্থিতি পরীক্ষা করা।

এই ম্যাচার্সগুলি আপনাকে আরও ব্যাপক এবং বিস্তৃত পরীক্ষা পরিচালনা করতে সাহায্য করবে।

Content added By

RSpec এ compound matchers যেমন and, or, এবং not ব্যবহার করা হয় একাধিক প্রত্যাশা (expectations) একসাথে পরীক্ষা করার জন্য। এগুলি আপনাকে একটি একক টেস্ট কেসে আরও জটিল এবং সংক্ষিপ্ত টেস্ট কন্ডিশন লিখতে সাহায্য করে। যখন আপনি একাধিক শর্ত বা শর্তের সমন্বয় পরীক্ষা করতে চান, তখন এই matchers ব্যবহার করা সুবিধাজনক।


১. and Matcher

and matcher দুটি শর্ত পরীক্ষা করে এবং দুইটি শর্তই সত্য হতে হবে। এটি দুটি matcher একসাথে যুক্ত করে এবং প্রত্যেকটি শর্ত পাস করতে হবে।

সিনট্যাক্স:

expect(actual_value).to match_a_condition.and match_another_condition

উদাহরণ:

describe "Testing with `and` matcher" do
  it "checks both conditions" do
    number = 5
    expect(number).to be > 3.and be < 10
  end
end

এই উদাহরণে:

  • প্রথম শর্ত পরীক্ষা করছে যে number ৩ এর চেয়ে বড় কি না।
  • দ্বিতীয় শর্ত পরীক্ষা করছে যে number ১০ এর চেয়ে ছোট কি না।
  • দুইটি শর্তই সত্য হতে হবে, তখনই টেস্ট পাস করবে।

২. or Matcher

or matcher দুটি শর্ত পরীক্ষা করে এবং যেকোনো একটি শর্তও সত্য হলে টেস্ট পাস হবে।

সিনট্যাক্স:

expect(actual_value).to match_a_condition.or match_another_condition

উদাহরণ:

describe "Testing with `or` matcher" do
  it "checks if either condition is true" do
    number = 7
    expect(number).to be < 5.or be > 3
  end
end

এই উদাহরণে:

  • প্রথম শর্ত পরীক্ষা করছে যে number ৫ এর চেয়ে ছোট কি না।
  • দ্বিতীয় শর্ত পরীক্ষা করছে যে number ৩ এর চেয়ে বড় কি না।
  • যেহেতু দ্বিতীয় শর্ত (এটি number > 3) সত্য, টেস্টটি পাস হবে।

৩. not Matcher

not matcher একটি শর্তকে নাকচ করে, অর্থাৎ এটি পরীক্ষা করে যে নির্দিষ্ট শর্ত সত্য নয়

সিনট্যাক্স:

expect(actual_value).to not_to match_a_condition

অথবা, not_to ব্যবহার করা যেতে পারে:

expect(actual_value).not_to match_a_condition

উদাহরণ:

describe "Testing with `not` matcher" do
  it "checks if a condition is not true" do
    number = 5
    expect(number).not_to be < 3
  end
end

এই উদাহরণে:

  • শর্তটি পরীক্ষা করছে যে number ৩ এর চেয়ে ছোট নয়।
  • যেহেতু number ৫, এটি ৩ এর চেয়ে ছোট নয়, তাই টেস্টটি পাস হবে।

Compound Matchers এর সমন্বয়

আপনি and, or, এবং not matchers একসাথে ব্যবহার করে আরও জটিল পরীক্ষা করতে পারেন।

উদাহরণ:

describe "Testing compound matchers" do
  it "checks multiple conditions" do
    number = 7
    expect(number).to be > 5.and be < 10.or be > 20
  end
end

এই উদাহরণে:

  • প্রথম অংশ পরীক্ষা করছে যে number ৫ এর চেয়ে বড়।
  • দ্বিতীয় অংশ পরীক্ষা করছে যে number ১০ এর চেয়ে ছোট।
  • তৃতীয় অংশ পরীক্ষা করছে যে number ২০ এর চেয়ে বড়।
  • টেস্টটি পাস হবে কারণ প্রথম দুটি শর্ত (number > 5 এবং number < 10) সত্য।

সারাংশ

  • and: দুটি শর্তের উভয়ই সত্য হতে হবে।
  • or: যেকোনো এক শর্ত সত্য হলে টেস্ট পাস করবে।
  • not: শর্তটি সত্য নয় তা যাচাই করবে।

এই compound matchers ব্যবহার করে আপনি RSpec-এ আরও জটিল এবং অর্থপূর্ণ পরীক্ষা লিখতে পারেন, যা আপনার টেস্টগুলিকে আরও শক্তিশালী এবং পঠনযোগ্য করে তোলে।

Content added By

RSpec-এ Collection Matchers এবং Regular Expressions খুবই কার্যকরী টুলস যা আপনার টেস্টগুলির নির্ভুলতা এবং কার্যকারিতা নিশ্চিত করতে সাহায্য করে। নিচে এই দুইটি বৈশিষ্ট্য নিয়ে বিস্তারিত আলোচনা করা হলো।


১. Collection Matchers

RSpec-এ Collection Matchers ব্যবহার করে আপনি যেকোনো Array, Hash, বা Enumerable ধরনের কোলেকশনের উপাদানগুলির উপর পরীক্ষা চালাতে পারেন। কিছু সাধারণ Collection Matchers হল:

include

include matcher ব্যবহার করে আপনি পরীক্ষা করতে পারেন যে কোনো কোলেকশন নির্দিষ্ট উপাদান অন্তর্ভুক্ত করছে কিনা।

উদাহরণ:

expect([1, 2, 3]).to include(2)  # পাস হবে কারণ ২ অ্যারেতে অন্তর্ভুক্ত
expect([1, 2, 3]).to include(4)  # ফেইল হবে কারণ ৪ অ্যারেতে নেই

include matcher স্ট্রিং এবং হ্যাশের জন্যও কাজ করে।

উদাহরণ (স্ট্রিং):

expect("hello world").to include("world")  # পাস হবে কারণ "world" স্ট্রিংটিতে রয়েছে

উদাহরণ (হ্যাশ):

expect({a: 1, b: 2}).to include(:a)  # পাস হবে কারণ :a হ্যাশে রয়েছে

match_array

match_array matcher ব্যবহার করা হয় যখন আপনি চেক করতে চান যে একটি অ্যারে নির্দিষ্ট উপাদানগুলোই ধারণ করছে, তবে ক্রম (order) গাণিতিকভাবে কোনো বিষয় নয়।

উদাহরণ:

expect([1, 2, 3]).to match_array([3, 2, 1])  # পাস হবে, ক্রম গুরুত্বহীন

contain_exactly

contain_exactly matcher-টি match_array এর মতোই, তবে এটি অর্ডার মেনে চলতে পারে। যদি আর্ডার গুরুত্বপূর্ণ হয় তবে এটি ব্যবহার করুন।

উদাহরণ:

expect([1, 2, 3]).to contain_exactly(1, 2, 3)  # পাস হবে
expect([1, 2, 3]).to contain_exactly(3, 2, 1)  # ফেইল হবে কারণ অর্ডার ভিন্ন

all

all matcher ব্যবহার করে আপনি একটি কোলেকশনের সব উপাদান নির্দিষ্ট শর্ত পূর্ণ করছে কিনা তা যাচাই করতে পারেন।

উদাহরণ:

expect([2, 4, 6]).to all(be_even)  # পাস হবে কারণ সবগুলো সংখ্যা even

২. Regular Expressions

RSpec-এ Regular Expressions (regex) ব্যবহার করা যায় স্ট্রিং বা টেক্সটের মধ্যে নির্দিষ্ট প্যাটার্ন খুঁজে বের করতে। match matcher এই কাজের জন্য ব্যবহৃত হয়।

match

match matcher-টি স্ট্রিং এর মধ্যে একটি রেগুলার এক্সপ্রেশন মিলে কিনা পরীক্ষা করে।

উদাহরণ:

expect("hello world").to match(/hello/)  # পাস হবে কারণ "hello" প্যাটার্নটি স্ট্রিংয়ে রয়েছে
expect("hello world").to match(/world$/)  # পাস হবে কারণ "world" স্ট্রিংয়ের শেষের অংশ
expect("hello world").to match(/^hello/)  # পাস হবে কারণ "hello" স্ট্রিংয়ের শুরুতে রয়েছে

রেগুলার এক্সপ্রেশন ব্যবহার

এখানে কয়েকটি সাধারণ রেগুলার এক্সপ্রেশন প্যাটার্নের উদাহরণ দেওয়া হলো:

  • ^: স্ট্রিংয়ের শুরু
  • $: স্ট্রিংয়ের শেষ
  • .: যেকোনো একক অক্ষর
  • *: পূর্ববর্তী অক্ষর ০ অথবা এর বেশি বার
  • +: পূর্ববর্তী অক্ষর ১ অথবা এর বেশি বার
  • \d: যে কোনো ডিজিট
  • \w: যে কোনো শব্দ (অক্ষর, সংখ্যা, আন্ডারস্কোর)

উদাহরণ (বিস্তারিত):

# স্ট্রিংয়ের শুরুতে "hello" থাকার বিষয়টি পরীক্ষা
expect("hello world").to match(/^hello/)  # পাস হবে

# স্ট্রিংয়ের শেষের অংশে "world" থাকার বিষয়টি পরীক্ষা
expect("hello world").to match(/world$/)  # পাস হবে

# শুধুমাত্র সংখ্যা পরীক্ষা (যেমন 123)
expect("123").to match(/^\d+$/)  # পাস হবে, কারণ এটি পুরোপুরি সংখ্যা
expect("123abc").to match(/\d+/)  # পাস হবে, কারণ এতে সংখ্যার প্যাটার্ন রয়েছে

# একাধিক ডিজিট এবং অক্ষর মিলিয়ে প্যাটার্ন ব্যবহার
expect("hello123").to match(/\w+\d+/)  # পাস হবে, কারণ এটি একটি শব্দ এবং একটি সংখ্যা

সারাংশ

  • Collection Matchers:
    • include, match_array, contain_exactly, এবং all ব্যবহার করে অ্যারে, স্ট্রিং বা হ্যাশের মধ্যে নির্দিষ্ট উপাদান বা শর্ত খুঁজে বের করতে সাহায্য করে।
  • Regular Expressions:
    • match matcher-টি স্ট্রিংয়ে রেগুলার এক্সপ্রেশন মিলিয়ে চেক করতে ব্যবহার হয়।
    • রেগুলার এক্সপ্রেশন প্যাটার্নগুলির মাধ্যমে আপনি আরো শক্তিশালী এবং নির্দিষ্ট অনুসন্ধান করতে পারেন, যেমন স্ট্রিংয়ের শুরু, শেষ বা নির্দিষ্ট চরিত্রের প্যাটার্ন।

এগুলি আপনার RSpec টেস্টিংকে আরও শক্তিশালী, নির্ভুল এবং কার্যকর করে তোলে।

Content added By

RSpec-এ side effects মানে হল এমন কোন পরিবর্তন যা কোনো ফাংশন বা মেথড চালানোর পর ঘটে, যেমন কোনো ভ্যারিয়েবল, ডাটাবেস রেকর্ড, ফাইল, বা অন্য কোন বাইরের সিস্টেমে পরিবর্তন আসা। সাইড ইফেক্টস টেস্ট করা অত্যন্ত গুরুত্বপূর্ণ, বিশেষত যখন আপনার কোড বাইরের সিস্টেম বা ডেটা পERSISTেন্সের সাথে কাজ করে।

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


সাইড ইফেক্টস কী?

সাইড ইফেক্টস হল সেই সব পরিবর্তন যা কোড চালানোর ফলে ঘটে এবং যেগুলি আপনি পরীক্ষার মাধ্যমে দেখতে পারবেন। এগুলোর মধ্যে হতে পারে:

  • অবজেক্টের অবস্থা পরিবর্তন।
  • গ্লোবাল ভ্যারিয়েবল পরিবর্তন।
  • ডাটাবেস বা ফাইলে লেখা।
  • HTTP অনুরোধ পাঠানো বা নেটওয়ার্কের অবস্থায় পরিবর্তন।

উদাহরণস্বরূপ, যখন কোনো ব্যবহারকারী লগ ইন করে এবং ডাটাবেসে তার লগ ইন টাইম স্ট্যাম্প আপডেট হয়, তখন এটি একটি সাইড ইফেক্ট।

সাইড ইফেক্ট টেস্ট করার উদাহরণ

ধরা যাক, আমাদের একটি User ক্লাস আছে যা ব্যবহারকারী লগ ইন করলে last_login অ্যাট্রিবিউট আপডেট করে। আমরা পরীক্ষা করতে চাই যে login মেথডটি কল করলে last_login সঠিকভাবে আপডেট হয়।

উদাহরণ কোড:

class User
  attr_accessor :name, :last_login

  def initialize(name)
    @name = name
    @last_login = nil
  end

  def login
    @last_login = Time.now
  end
end

এখন, আমরা চাই যে যখন login মেথডটি কল হবে, তখন last_login আপডেট হবে। এটির সাইড ইফেক্ট টেস্ট করতে হলে আমরা RSpec ব্যবহার করতে পারি।

১. it ব্লকে সাইড ইফেক্ট টেস্ট করা

আমরা it ব্লকের মধ্যে সাইড ইফেক্ট পরীক্ষা করতে পারি, যেমন last_login পরিবর্তন হওয়া।

describe User do
  let(:user) { User.new("Alice") }

  it "should update the last_login time when user logs in" do
    # আগের last_login টাইম সংরক্ষণ
    previous_time = user.last_login

    # login মেথড কল করা
    user.login

    # সাইড ইফেক্ট (last_login পরিবর্তন) পরীক্ষা করা
    expect(user.last_login).not_to eq(previous_time)
    expect(user.last_login).to be_within(1.second).of(Time.now)
  end
end

ব্যাখ্যা:

  • previous_time এ আমরা last_login এর আগের মান সংরক্ষণ করেছি, যাতে পরে পরীক্ষণ করতে পারি এটি পরিবর্তিত হয়েছে কিনা।
  • টেস্টে আশা করা হচ্ছে যে, login মেথড কল করার পর last_login আগের মানের সমান থাকবে না এবং বর্তমান সময়ের কাছাকাছি হবে।

২. before এবং after ব্লক দিয়ে সাইড ইফেক্ট টেস্ট

before এবং after ব্লকগুলি টেস্টের আগে বা পরে কোড চালানোর জন্য ব্যবহৃত হয়। সাইড ইফেক্ট টেস্ট করার সময় যদি ডাটাবেস বা ফাইলের মতো বাইরের সিস্টেমের সাথে কাজ করতে হয়, তখন এগুলি খুবই কার্যকরী হতে পারে।

উদাহরণ:

ধরা যাক, আমাদের একটি কোড আছে যা ফাইল তৈরি করে একটি সাইড ইফেক্ট হিসেবে:

class FileCreator
  def create_file(filename, content)
    File.open(filename, "w") { |f| f.write(content) }
  end
end

এখন, আমরা পরীক্ষা করতে চাই যে সঠিকভাবে ফাইল তৈরি হচ্ছে কিনা।

describe FileCreator do
  let(:filename) { "test_file.txt" }
  let(:content) { "Hello, World!" }
  let(:file_creator) { FileCreator.new }

  # টেস্টের পরে ফাইলটি মুছে ফেলা হবে
  after do
    File.delete(filename) if File.exist?(filename)
  end

  it "creates a file with the correct content" do
    # নিশ্চিত হওয়া যে ফাইলটি শুরুতে নেই
    expect(File.exist?(filename)).to be_falsey

    # মেথড কল করা যা সাইড ইফেক্ট তৈরি করবে
    file_creator.create_file(filename, content)

    # নিশ্চিত হওয়া যে ফাইলটি তৈরি হয়েছে এবং সঠিক কন্টেন্ট রয়েছে
    expect(File.exist?(filename)).to be_truthy
    expect(File.read(filename)).to eq(content)
  end
end

ব্যাখ্যা:

  • after ব্লক নিশ্চিত করে যে টেস্ট শেষ হলে ফাইলটি মুছে ফেলা হবে, এমনকি টেস্টটি ব্যর্থ হলেও।
  • it ব্লকে আমরা প্রথমে নিশ্চিত হচ্ছি যে ফাইলটি নেই, তারপর create_file মেথড কল করার পর এটি তৈরি হয়ে সঠিক কন্টেন্ট ধারণ করছে কিনা পরীক্ষা করা হচ্ছে।

৩. অ্যাসিনক্রোনাস সাইড ইফেক্ট টেস্ট

কিছু সময় সাইড ইফেক্ট অ্যাসিনক্রোনাস বা বিলম্বিত হতে পারে, যেমন ব্যাকগ্রাউন্ড জব চালানোর পর ইমেইল পাঠানো। এমন ক্ষেত্রে আপনি expect এবং ব্লক ব্যবহার করে সাইড ইফেক্টটির জন্য অপেক্ষা করতে পারেন।

উদাহরণস্বরূপ, যদি আপনার একটি ব্যাকগ্রাউন্ড জব থাকে যা ইমেইল পাঠায়:

class UserMailerJob < ApplicationJob
  queue_as :default

  def perform(user)
    UserMailer.welcome_email(user).deliver_now
  end
end

অ্যাসিনক্রোনাস সাইড ইফেক্ট টেস্ট:

describe UserMailerJob do
  let(:user) { create(:user) }

  it "sends a welcome email" do
    # প্রথমে নিশ্চিত করি যে কোনো ইমেইল পাঠানো হয়নি
    expect(ActionMailer::Base.deliveries.count).to eq(0)

    # ব্যাকগ্রাউন্ড জব এঞ্জিক করা
    UserMailerJob.perform_later(user)

    # অপেক্ষা করে নিশ্চিত করি যে ইমেইল পাঠানো হয়েছে
    expect {
      perform_enqueued_jobs
    }.to change { ActionMailer::Base.deliveries.count }.by(1)
  end
end

ব্যাখ্যা:

  • perform_enqueued_jobs ব্যাকগ্রাউন্ড জবটি সিঙ্ক্রোনাসভাবে চালিয়ে দেয়, যাতে টেস্টের সময় জব সম্পন্ন হয়।
  • expect { ... }.to change নিশ্চিত করে যে ইমেইল পাঠানোর পর ইমেইল সংখ্যা ১ বাড়বে।

সারাংশ

RSpec-এ সাইড ইফেক্ট টেস্ট করার জন্য ব্লক ব্যবহার করা অত্যন্ত কার্যকরী। ব্লক ব্যবহার করে আপনি ডাটাবেস পরিবর্তন, ফাইল তৈরি বা অ্যাসিনক্রোনাস অপারেশনসের সাইড ইফেক্টস পরীক্ষা করতে পারেন। it, before, after, এবং expect ব্লক সহ RSpec এর টেস্টিং ক্ষমতা সাইড ইফেক্টস সঠিকভাবে যাচাই করার জন্য খুবই উপযোগী।

Content added By

RSpec-এ Custom Matchers তৈরি করার মাধ্যমে আপনি আপনার নির্দিষ্ট টেস্টিং প্রয়োজনের জন্য নতুন ম্যাচার তৈরি করতে পারেন। এটি বিশেষত তখন উপকারী হয় যখন আপনি এমন কিছু চেক বা যাচাই করতে চান যা রুবির বিল্ট-ইন ম্যাচারগুলির মাধ্যমে সম্ভব নয়। Custom Matchers-এ সাধারণত match বা matches? মেথড ব্যবহার করা হয় যা টেস্টের সঠিকতা নির্ধারণ করে।


Custom Matchers তৈরি করার পদক্ষেপ

  1. Matcher তৈরি করা: প্রথমে RSpec::Matchers ক্লাস ব্যবহার করে একটি কাস্টম ম্যাচার তৈরি করতে হবে।
  2. matcher method সংজ্ঞায়িত করা: কাস্টম ম্যাচার তৈরির পর, আপনি matches? মেথডে কোড যুক্ত করবেন যাতে এটি নির্ধারণ করতে পারে যে কোন শর্তটি সঠিক কিনা।
  3. failure_message ও success_message সংজ্ঞায়িত করা: এই মেথড দুটি ব্যবহার করে আপনি টেস্ট পাস বা ফেল হলে কি বার্তা দেখাবেন তা কাস্টমাইজ করতে পারবেন।

উদাহরণ: কাস্টম ম্যাচার তৈরি করা

ধরা যাক, আপনি একটি কাস্টম ম্যাচার তৈরি করতে চান যা যাচাই করবে যে একটি অ্যারে একটি নির্দিষ্ট সংখ্যা অন্তর্ভুক্ত করে কিনা।

১. Custom Matcher তৈরি করা

# spec/support/matchers/include_number.rb
RSpec::Matchers.define :include_number do |expected|
  match do |actual|
    # এখানে অ্যারের মধ্যে নির্দিষ্ট সংখ্যা আছে কিনা যাচাই করা হচ্ছে
    actual.include?(expected)
  end

  failure_message do |actual|
    "expected #{actual} to include #{expected}"
  end

  failure_message_when_negated do |actual|
    "expected #{actual} not to include #{expected}"
  end
end

এখানে include_number নামে একটি কাস্টম ম্যাচার তৈরি করা হয়েছে যা অ্যারের মধ্যে একটি নির্দিষ্ট সংখ্যা উপস্থিত কিনা তা যাচাই করবে।

২. কাস্টম ম্যাচার ব্যবহার করা

এখন, আপনি এই কাস্টম ম্যাচারটি আপনার টেস্টে ব্যবহার করতে পারবেন:

# spec/array_spec.rb
describe Array do
  it "should include number 5" do
    expect([1, 2, 3, 4, 5]).to include_number(5)
  end

  it "should not include number 6" do
    expect([1, 2, 3, 4, 5]).not_to include_number(6)
  end
end

এখানে, include_number কাস্টম ম্যাচারটি ব্যবহার করা হয়েছে যা যাচাই করছে যে অ্যারেটি 5 অন্তর্ভুক্ত করেছে কিনা এবং 6 অন্তর্ভুক্ত না করার জন্য not_to ব্যবহার করা হয়েছে।


Custom Matchers-এ অতিরিক্ত বৈশিষ্ট্য সংযোজন

Custom Matchers আরও উন্নত করা যেতে পারে বিশেষ কিছু বৈশিষ্ট্য যেমন:

  1. description মেথড: আপনি যদি কাস্টম ম্যাচারের একটি বর্ণনা চান, তাহলে আপনি description মেথড ব্যবহার করতে পারেন।
RSpec::Matchers.define :include_number do |expected|
  match do |actual|
    actual.include?(expected)
  end

  description do
    "include the number #{expected}"
  end
end
  1. supports_block_expectations: আপনি যদি কাস্টম ম্যাচারে ব্লক সমর্থন চান, তাহলে supports_block_expectations ব্যবহার করতে পারেন।
RSpec::Matchers.define :be_a_multiple_of do |expected|
  match do |actual|
    actual % expected == 0
  end

  supports_block_expectations
end

এটি expect { some_code }.to be_a_multiple_of(5) এর মতো ব্লক-বেসড চেক করার অনুমতি দেয়।


Custom Matchers এর সুবিধা

  1. পুনঃব্যবহারযোগ্যতা: একবার কাস্টম ম্যাচার তৈরি করলে, আপনি এটি পুনঃব্যবহার করতে পারবেন। একাধিক টেস্টের মধ্যে একই আচরণ যাচাই করার জন্য এটি উপকারী।
  2. কোডের পরিষ্কারতা: আপনার টেস্ট কোড পরিষ্কার এবং সহজ হতে পারে যদি আপনি কাস্টম ম্যাচার তৈরি করে কাজ করেন, কারণ আপনি কোডের জন্য নতুন, পরিষ্কার সিম্যান্টিক্স তৈরি করতে পারেন।
  3. পুনঃব্যবহারযোগ্য, রিডেবল এবং এক্সপ্রেসিভ: কাস্টম ম্যাচারগুলো কোডকে আরও এক্সপ্রেসিভ এবং পাঠযোগ্য করে তোলে।

সারাংশ

Custom Matchers RSpec-এ একটি শক্তিশালী ফিচার, যা টেস্ট কোডকে আরও বোধগম্য এবং পুনঃব্যবহারযোগ্য করতে সাহায্য করে। এর মাধ্যমে আপনি আপনার নির্দিষ্ট প্রয়োজন অনুযায়ী নতুন ম্যাচার তৈরি করতে পারেন, যা পরীক্ষার প্রক্রিয়াকে সহজ এবং পরিষ্কার করে তোলে। Custom Matchers ব্যবহারের মাধ্যমে আপনি টেস্টগুলির স্বচ্ছতা এবং মডুলারিটি বৃদ্ধি করতে পারেন।

Content added By
Promotion

Are you sure to start over?

Loading...