Exception Handling হচ্ছে প্রোগ্রামিংয়ে এমন একটি পদ্ধতি যার মাধ্যমে অ্যাপ্লিকেশনে বিভিন্ন ত্রুটি (error) বা ব্যতিক্রম (exception) সঠিকভাবে মোকাবেলা করা হয়। RSpec দিয়ে exception handling টেস্ট লেখার মাধ্যমে আপনি নিশ্চিত হতে পারেন যে, আপনার কোড বিভিন্ন ধরনের ত্রুটি সঠিকভাবে ধরা এবং সেগুলোর সাথে উপযুক্তভাবে কাজ করছে।
RSpec এ exception handling টেস্ট লেখার জন্য raise_error ম্যাচার ব্যবহার করা হয়। এটি পরীক্ষায় ব্যবহৃত কোডের মধ্যে ত্রুটি উঠছে কিনা এবং ত্রুটির প্রকার সঠিক কি না তা যাচাই করে।
১. সাধারণ Exception Handling Test
ধরা যাক, আপনার একটি ক্লাস রয়েছে যেটি একটি ভ্যালিডেশন যাচাই করে এবং যদি ইনপুট সঠিক না হয় তবে একটি exception রেইজ করে:
class Calculator
def divide(a, b)
raise "Cannot divide by zero" if b == 0
a / b
end
endএখন আপনি RSpec দিয়ে পরীক্ষা করবেন যে, যদি দ্বিতীয় ইনপুট 0 হয়, তবে "Cannot divide by zero" ত্রুটিটি সঠিকভাবে রেইজ হচ্ছে কি না।
টেস্ট কোড:
RSpec.describe Calculator do
describe "#divide" do
it "যখন বিভাজক ০ হবে, তখন ত্রুটি রেইজ করবে" do
calc = Calculator.new
expect { calc.divide(10, 0) }.to raise_error("Cannot divide by zero")
end
end
endএখানে:
expect { calc.divide(10, 0) }: এটিdivideমেথড কল করার সময় রেইজ হওয়া exception চেক করে।to raise_error("Cannot divide by zero"): এটি নিশ্চিত করে যে, যখন বিভাজক0হবে, তখন"Cannot divide by zero"ত্রুটি রেইজ হবে।
২. Custom Exception Handling Test
আপনি যদি একটি কাস্টম exception তৈরি করে থাকেন, তাহলে তাও RSpec দিয়ে পরীক্ষা করা যেতে পারে।
কাস্টম Exception তৈরি:
class InvalidInputError < StandardError; end
class Calculator
def divide(a, b)
raise InvalidInputError, "দ্বিতীয় ইনপুট হতে হবে ০ এর বাইরে" if b == 0
a / b
end
endএখন, আপনি এই কাস্টম exception এর জন্য টেস্ট লিখতে পারেন।
টেস্ট কোড:
RSpec.describe Calculator do
describe "#divide" do
it "যখন বিভাজক ০ হবে, তখন InvalidInputError ত্রুটি রেইজ করবে" do
calc = Calculator.new
expect { calc.divide(10, 0) }.to raise_error(InvalidInputError, "দ্বিতীয় ইনপুট হতে হবে ০ এর বাইরে")
end
end
endএখানে:
InvalidInputErrorএকটি কাস্টম exception ক্লাস।raise_error(InvalidInputError, "দ্বিতীয় ইনপুট হতে হবে ০ এর বাইরে")নিশ্চিত করছে যে, ত্রুটির প্রকার এবং বার্তা উভয়ই সঠিক।
৩. Multiple Exceptions Handling Test
একই কোডে একাধিক ধরনের exception handling টেস্টও করা যেতে পারে। ধরুন, আপনার Calculator ক্লাসে দুটি আলাদা exception handling রয়েছে:
ক্লাস কোড:
class Calculator
def divide(a, b)
raise ArgumentError, "অবৈধ ইনপুট" if a.nil? || b.nil?
raise ZeroDivisionError, "বিভাজক শূন্য হতে পারে না" if b == 0
a / b
end
endএখন, আপনি দুটি আলাদা exception পরীক্ষা করবেন:
টেস্ট কোড:
RSpec.describe Calculator do
describe "#divide" do
it "যখন কোন ইনপুট nil হবে, তখন ArgumentError ত্রুটি রেইজ করবে" do
calc = Calculator.new
expect { calc.divide(nil, 5) }.to raise_error(ArgumentError, "অবৈধ ইনপুট")
end
it "যখন বিভাজক ০ হবে, তখন ZeroDivisionError ত্রুটি রেইজ করবে" do
calc = Calculator.new
expect { calc.divide(10, 0) }.to raise_error(ZeroDivisionError, "বিভাজক শূন্য হতে পারে না")
end
end
endএখানে:
ArgumentErrorএবংZeroDivisionErrorদুইটি আলাদা exception ধরা হচ্ছে, এবং তাদের বার্তা সঠিকভাবে যাচাই করা হচ্ছে।
৪. Exception Handling Without Message
যদি আপনি শুধুমাত্র exception এর উপস্থিতি যাচাই করতে চান, বার্তার প্রয়োজন না থাকে, তাহলে আপনি বার্তা ছাড়া শুধুমাত্র exception প্রকার যাচাই করতে পারেন:
টেস্ট কোড:
RSpec.describe Calculator do
describe "#divide" do
it "যখন বিভাজক ০ হবে, তখন ZeroDivisionError রেইজ করবে" do
calc = Calculator.new
expect { calc.divide(10, 0) }.to raise_error(ZeroDivisionError)
end
end
endএখানে:
raise_error(ZeroDivisionError)শুধু exception প্রকার পরীক্ষা করছে, বার্তার প্রতি কোনো যাচাই করা হচ্ছে না।
সারাংশ
RSpec দিয়ে exception handling টেস্ট লেখার মাধ্যমে আপনি আপনার কোডের ত্রুটির প্রকার এবং তাদের বার্তা যাচাই করতে পারেন। এটি কোডের robust এবং error-free নিশ্চিত করার জন্য অত্যন্ত গুরুত্বপূর্ণ। raise_error ম্যাচার ব্যবহার করে আপনি exception রেইজ হচ্ছে কিনা, এবং রেইজ হওয়া exception সঠিক কি না তা পরীক্ষা করতে পারেন।
Read more