Web Development Custom Matchers তৈরি করা গাইড ও নোট

237

JasmineJS এর Matchers হলো টেস্টিংয়ের জন্য ব্যবহারকারী সংজ্ঞায়িত ফাংশন বা শর্ত যা আপনাকে পরীক্ষার ফলাফল যাচাই করতে সাহায্য করে। যেমন toBe(), toEqual(), toHaveBeenCalled() ইত্যাদি। তবে, কখনো কখনো আপনার প্রয়োজন হয় এমন কোনো কাস্টম মাচার তৈরি করার, যা সাধারণ Jasmine মাচার দ্বারা কাভার করা যায় না। Custom Matchers এর মাধ্যমে আপনি আপনার নিজস্ব বিশেষ মাচার তৈরি করতে পারেন, যা আপনার টেস্টিং প্রক্রিয়াকে আরও গতিশীল এবং শক্তিশালী করে।


Custom Matchers তৈরি করার প্রয়োজনীয়তা

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

  • আপনি যদি একটি নির্দিষ্ট অবজেক্টে কোনো প্রপার্টি বা মান চেক করতে চান।
  • বা আপনি যদি একটি কাস্টম ফাংশনের ফলাফল যাচাই করতে চান যা Jasmine এর ডিফল্ট মাচার দ্বারা কাভার করা সম্ভব নয়।

এছাড়া, কাস্টম মাচার ব্যবহারের মাধ্যমে কোডের পুনঃব্যবহারযোগ্যতা এবং ক্লিনলিনেসও বাড়ানো যায়।


Custom Matcher এর কাঠামো

Jasmine এ কাস্টম মাচার তৈরি করতে expect.extend() অথবা jasmine.addMatchers() ফাংশন ব্যবহার করা হয়। এর মাধ্যমে আপনি Jasmine এর মূল ফিচারকে এক্সটেন্ড করতে পারেন এবং নতুন কাস্টম মাচার যুক্ত করতে পারেন।

jasmine.addMatchers() এর মাধ্যমে কাস্টম মাচার তৈরি

beforeEach(function() {
  jasmine.addMatchers({
    toBeEven: function() {
      return {
        compare: function(actual) {
          const result = {
            pass: actual % 2 === 0
          };
          if (result.pass) {
            result.message = actual + " is even";
          } else {
            result.message = actual + " is not even";
          }
          return result;
        }
      };
    }
  });
});

এখানে toBeEven একটি কাস্টম মাচার তৈরি করা হয়েছে যা একটি নম্বরকে পরীক্ষা করবে যে তা একটি even number (যুগ্ম সংখ্যা) কিনা।

  • compare ফাংশন: এখানে মূল কাজ হয়, যেখানে আমরা নম্বরটি পরীক্ষা করি এবং এর পরিণতি (pass বা fail) প্রদান করি।
  • result.pass: এটি নির্দেশ করবে যে, টেস্টটি সফল হয়েছে কিনা।
  • result.message: যদি টেস্টটি ব্যর্থ হয়, তবে একটি ব্যাখ্যামূলক বার্তা প্রদান করবে।

উদাহরণ:

describe("Custom matcher example", function() {
  beforeEach(function() {
    jasmine.addMatchers({
      toBeEven: function() {
        return {
          compare: function(actual) {
            const result = {
              pass: actual % 2 === 0
            };
            if (result.pass) {
              result.message = actual + " is even";
            } else {
              result.message = actual + " is not even";
            }
            return result;
          }
        };
      }
    });
  });

  it("should check if a number is even", function() {
    expect(4).toBeEven();  // সফল হবে
    expect(3).toBeEven();  // ব্যর্থ হবে
  });
});

এখানে:

  • প্রথম expect(4).toBeEven(); সফল হবে, কারণ ৪ একটি even number।
  • দ্বিতীয় expect(3).toBeEven(); ব্যর্থ হবে, কারণ ৩ একটি odd number।

Custom Matcher এর ব্যবহারিক উদাহরণ

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

উদাহরণ:

beforeEach(function() {
  jasmine.addMatchers({
    toHaveProperty: function() {
      return {
        compare: function(actual, expected) {
          const result = {
            pass: actual.hasOwnProperty(expected)
          };
          if (result.pass) {
            result.message = "The object has the property " + expected;
          } else {
            result.message = "The object does not have the property " + expected;
          }
          return result;
        }
      };
    }
  });
});

describe("Custom matcher for object property", function() {
  it("should check if an object has a certain property", function() {
    const obj = { name: "John", age: 30 };
    expect(obj).toHaveProperty("name");  // সফল হবে
    expect(obj).toHaveProperty("gender");  // ব্যর্থ হবে
  });
});

এখানে:

  • toHaveProperty মাচারটি পরীক্ষা করবে যে, একটি অবজেক্টে নির্দিষ্ট প্রপার্টি আছে কিনা।
  • প্রথম expect(obj).toHaveProperty("name"); সফল হবে, কারণ name প্রপার্টি অবজেক্টে রয়েছে।
  • দ্বিতীয় expect(obj).toHaveProperty("gender"); ব্যর্থ হবে, কারণ gender প্রপার্টি অবজেক্টে নেই।

কাস্টম মাচারের বিশেষ সুবিধা

  • টেস্টের কাস্টমাইজেশন: আপনি আপনার নিজস্ব শর্ত অনুযায়ী মাচার তৈরি করতে পারেন, যা Jasmine এর ডিফল্ট মাচার দ্বারা কাভার করা সম্ভব নয়।
  • পুনঃব্যবহারযোগ্যতা: একবার কাস্টম মাচার তৈরি করলে আপনি সহজেই অন্যান্য টেস্টে ব্যবহার করতে পারবেন।
  • কোডের পরিষ্কারতা: কাস্টম মাচার ব্যবহার করে আপনার টেস্ট কোড আরো পরিষ্কার এবং বোধগম্য হতে পারে।

সারাংশ

  • Custom Matchers JasmineJS এ একটি বিশেষ ফিচার যা আপনাকে নিজস্ব মাচার তৈরি করতে দেয়, যার মাধ্যমে আপনি আপনার টেস্টের জন্য প্রয়োজনীয় বিশেষ শর্ত বা আচরণ পরীক্ষা করতে পারেন।
  • jasmine.addMatchers() ফাংশন দিয়ে আপনি কাস্টম মাচার তৈরি করতে পারেন এবং টেস্টিং প্রক্রিয়াকে আরো শক্তিশালী এবং লচিলি (flexible) করতে পারেন।
  • কাস্টম মাচার ব্যবহার করে আপনি টেস্টের কার্যকারিতা বাড়াতে এবং বিশেষ শর্তে টেস্ট ফলাফল যাচাই করতে পারেন, যা Jasmine এর ডিফল্ট মাচার দ্বারা সম্ভব নয়।

এভাবে JasmineJS এর কাস্টম মাচার আপনার টেস্টিং প্রক্রিয়াকে আরো শক্তিশালী এবং পরিস্কার করতে সাহায্য করে।

Content added By

Custom Matchers এর ভূমিকা

237

JasmineJS এ Custom Matchers একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে আপনার নিজস্ব ম্যাচিং লজিক তৈরি করতে সহায়তা করে। JasmineJS এর প্রাক-নির্ধারিত ম্যাচার্স যেমন toBe(), toEqual(), toContain() ইত্যাদি সাধারণ টেস্টিং চেক করতে ব্যবহৃত হয়। তবে কিছু সময় আপনার বিশেষ ধরনের টেস্টিং দরকার হতে পারে, যা JasmineJS এর ডিফল্ট ম্যাচার্স দ্বারা করা সম্ভব নয়। এ ধরনের পরিস্থিতিতে আপনি Custom Matchers তৈরি করতে পারেন, যা আপনার টেস্ট কেসের জন্য বিশেষ ধরনের ম্যাচিং কন্ডিশন সরবরাহ করবে।


Custom Matchers কি?

Custom Matchers হল এমন একটি ফাংশন যা একটি নতুন টেস্টিং লজিক বা শর্ত তৈরি করে এবং একটি expect() ব্লকের মাধ্যমে ব্যবহার করা যায়। আপনি JasmineJS এ নতুন একটি ম্যাচার তৈরি করে সেটি আপনার টেস্ট কেসে ব্যবহার করতে পারবেন, যা স্বতন্ত্রভাবে আপনার টেস্টের জন্য কার্যকরী হবে।

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


Custom Matcher তৈরি করার পদ্ধতি

JasmineJS এ কাস্টম ম্যাচার তৈরি করতে, jasmine.addMatchers() ফাংশন ব্যবহার করা হয়। এই ফাংশনটি একটি অবজেক্ট নেয়, যার মধ্যে আপনার কাস্টম ম্যাচার্সের লজিক থাকে।

সিনট্যাক্স:

beforeEach(function() {
  jasmine.addMatchers({
    toBeEven: function() {
      return {
        compare: function(actual) {
          const result = {
            pass: actual % 2 === 0
          };
          result.message = actual + " is " + (result.pass ? "even" : "odd");
          return result;
        }
      };
    }
  });
});

এখানে:

  • compare(): এটি একটি ফাংশন যা আপনার কাস্টম ম্যাচারের লজিক ধারণ করে। এতে আপনি যা যাচাই করতে চান তা নির্ধারণ করবেন (যেমন, একটি সংখ্যা সঠিক কিনা)।
  • result.pass: এটি একটি বুলিয়ান ভ্যালু যা ফলস্বরূপ সত্য বা মিথ্যা হবে, এটি পরীক্ষা নির্ধারণ করে।
  • result.message: এটি একটি কাস্টম মেসেজ তৈরি করে, যা টেস্ট ফলস্বরূপ দেখাবে।

Custom Matcher ব্যবহার করা

একবার কাস্টম ম্যাচার তৈরি হয়ে গেলে, আপনি এটি expect() ব্লকের সাথে ব্যবহার করতে পারবেন।

উদাহরণ:

describe("Custom Matcher example", function() {
  
  beforeEach(function() {
    jasmine.addMatchers({
      toBeEven: function() {
        return {
          compare: function(actual) {
            const result = {
              pass: actual % 2 === 0
            };
            result.message = actual + " is " + (result.pass ? "even" : "odd");
            return result;
          }
        };
      }
    });
  });

  it("should check if a number is even", function() {
    expect(4).toBeEven();  // ৪ একটি সঠিক even সংখ্যা
    expect(5).not.toBeEven();  // ৫ একটি odd সংখ্যা
  });

});

এখানে:

  • toBeEven একটি কাস্টম ম্যাচার যা যাচাই করে যে একটি সংখ্যা even কিনা।
  • expect(4).toBeEven(): ৪ একটি even সংখ্যা হওয়ায় এই টেস্টটি পাস করবে।
  • expect(5).not.toBeEven(): ৫ একটি odd সংখ্যা হওয়ায় এই টেস্টটি পাস করবে।

Custom Matcher এর সৃজনশীল ব্যবহার

JasmineJS এর কাস্টম ম্যাচার্স শুধুমাত্র সংখ্যা বা স্ট্রিং যাচাইয়ের জন্য নয়, বরং এটি আরো জটিল ধরনের পরীক্ষা পরিচালনা করতে পারে, যেমন:

  1. অবজেক্টের প্রপার্টি পরীক্ষা করা
  2. ফাংশন কলের মাধ্যমে প্রাপ্ত আউটপুট যাচাই করা
  3. অর্থপূর্ণ বার্তা প্রদান

উদাহরণ: অবজেক্টের প্রপার্টি চেক করা

describe("Custom Matcher for object property", function() {

  beforeEach(function() {
    jasmine.addMatchers({
      toHaveProperty: function() {
        return {
          compare: function(actual, expected) {
            const result = {
              pass: actual.hasOwnProperty(expected)
            };
            result.message = actual + (result.pass ? " has the property " : " does not have the property ") + expected;
            return result;
          }
        };
      }
    });
  });

  it("should check if an object has a specific property", function() {
    const person = { name: "John", age: 30 };

    expect(person).toHaveProperty("name");  // 'name' প্রপার্টি আছে
    expect(person).not.toHaveProperty("address");  // 'address' প্রপার্টি নেই
  });

});

এখানে:

  • toHaveProperty() কাস্টম ম্যাচারটি যাচাই করছে যে নির্দিষ্ট অবজেক্টে একটি নির্দিষ্ট প্রপার্টি আছে কিনা।
  • expect(person).toHaveProperty("name"): person অবজেক্টে name প্রপার্টি আছে, তাই টেস্টটি পাস করবে।
  • expect(person).not.toHaveProperty("address"): person অবজেক্টে address প্রপার্টি নেই, তাই টেস্টটি পাস করবে।

Custom Matcher এর সাথে চেক করা বুলিয়ান শর্ত

আপনি বুলিয়ান শর্তেও কাস্টম ম্যাচার তৈরি করতে পারেন, যেমন true/false চেক করা।

উদাহরণ: True/False চেক করা

describe("Custom Matcher for boolean check", function() {

  beforeEach(function() {
    jasmine.addMatchers({
      toBeTrue: function() {
        return {
          compare: function(actual) {
            const result = {
              pass: actual === true
            };
            result.message = actual + " is " + (result.pass ? "true" : "false");
            return result;
          }
        };
      }
    });
  });

  it("should check if a value is true", function() {
    expect(true).toBeTrue();  // এটি true হওয়ায় টেস্ট পাস করবে
    expect(false).not.toBeTrue();  // এটি false হওয়ায় টেস্ট পাস করবে
  });

});

এখানে:

  • toBeTrue() একটি কাস্টম ম্যাচার যা যাচাই করছে যে কোন মান true কিনা।
  • expect(true).toBeTrue(): এটি true হওয়ায় টেস্ট পাস করবে।
  • expect(false).not.toBeTrue(): এটি false হওয়ায় টেস্ট পাস করবে।

কাস্টম ম্যাচার তৈরি করার সুবিধা

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

সারাংশ

JasmineJS এ Custom Matchers একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা আপনাকে আপনার নিজস্ব টেস্টিং শর্ত তৈরি করতে সাহায্য করে। আপনি jasmine.addMatchers() ব্যবহার করে কাস্টম ম্যাচার তৈরি করতে পারেন এবং এগুলিকে expect() ব্লকের সাথে ব্যবহার করতে পারেন। এই বৈশিষ্ট্যটি আপনার টেস্টিং প্রক্রিয়াকে আরো শক্তিশালী, পরিষ্কার এবং নির্দিষ্ট করে তোলে, যেখানে JasmineJS এর ডিফল্ট ম্যাচার্স যথেষ্ট নয়।

Content added By

Custom Matchers তৈরি এবং ব্যবহার

206

JasmineJS এর Custom Matchers আপনাকে নিজস্ব matcher তৈরি করার সুযোগ দেয়, যা আপনার টেস্ট কেসের জন্য বিশেষভাবে উপযোগী হতে পারে। Jasmine এ প্রাথমিকভাবে অনেক built-in matcher রয়েছে (যেমন toBe(), toEqual(), toContain()), কিন্তু কখনও কখনও আপনার নিজের বিশেষ matcher তৈরি করতে হতে পারে, যাতে আপনি কাস্টম শর্ত অনুযায়ী ফাংশনালিটি পরীক্ষা করতে পারেন।

Custom Matchers তৈরি করে আপনি আপনার টেস্ট কেসগুলোর মধ্যে আরও নির্দিষ্ট এবং প্রাসঙ্গিক যাচাই করতে পারেন।


Custom Matcher কি?

Custom Matcher হলো একটি বিশেষ matcher যা আপনি নিজের প্রয়োজন অনুযায়ী তৈরি করেন। এটি একটি ফাংশন হবে, যা expect() এর সাথে ব্যবহার করে কাস্টম লজিকের মাধ্যমে কোনো মান যাচাই করে।

Custom Matcher তৈরি করার ধাপ

Jasmine এ Custom Matcher তৈরি করতে expect.extend() মেথড ব্যবহার করতে হয়। এটি Jasmine এর matcher তালিকায় একটি নতুন matcher যুক্ত করে। নতুন matcherটি matchers অবজেক্টে যুক্ত হবে এবং আপনি পরে সেটি expect() এর সাথে ব্যবহার করতে পারবেন।


Custom Matcher তৈরি করার পদ্ধতি

expect.extend() ব্যবহার করে আপনি একটি নতুন matcher তৈরি করতে পারেন। নিচে এর একটি সাধারণ উদাহরণ দেওয়া হলো:

beforeEach(function() {
  jasmine.addMatchers({
    toBeEven: function() {
      return {
        compare: function(actual) {
          const result = {};
          result.pass = actual % 2 === 0;
          if (result.pass) {
            result.message = `Expected ${actual} to be an even number.`;
          } else {
            result.message = `Expected ${actual} to be an even number, but it is odd.`;
          }
          return result;
        }
      };
    }
  });
});

এখানে:

  • toBeEven একটি নতুন matcher তৈরি করা হয়েছে যা যাচাই করবে যে কোন সংখ্যা even (যুগল) কিনা।
  • compare() ফাংশনটি matcher এর মূল লজিক। এটি actual মানের সাথে কাজ করে এবং একটি অবজেক্ট রিটার্ন করে, যার মধ্যে:
    • pass: যদি পরীক্ষাটি সফল হয়, তাহলে এটি true হবে।
    • message: এটি সেই বার্তা যা টেস্ট ফলাফলের অংশ হিসেবে দেখানো হবে।

Custom Matcher ব্যবহার করা

একবার আপনার custom matcher তৈরি হয়ে গেলে, আপনি সেটি expect() এর সাথে ব্যবহার করতে পারবেন, যেমন Jasmine এর built-in matcher গুলো ব্যবহার করেন।

উদাহরণ:

describe("Custom matcher", function() {
  it("should check if a number is even", function() {
    expect(4).toBeEven();  // এটি পাস হবে কারণ ৪ একটি even সংখ্যা
    expect(5).toBeEven();  // এটি ফেল হবে কারণ ৫ একটি odd সংখ্যা
  });
});

এখানে:

  • toBeEven() matcher টি যাচাই করছে যে ৪ এবং ৫ সংখ্যাগুলি even কিনা।

Custom Matcher এর জন্য আরও উদাহরণ

১. toBeGreaterThanTen Custom Matcher

এই matcher টি যাচাই করবে যে একটি সংখ্যা ১০ এর বেশি কিনা।

beforeEach(function() {
  jasmine.addMatchers({
    toBeGreaterThanTen: function() {
      return {
        compare: function(actual) {
          const result = {};
          result.pass = actual > 10;
          if (result.pass) {
            result.message = `Expected ${actual} to be greater than 10.`;
          } else {
            result.message = `Expected ${actual} to be greater than 10, but it is not.`;
          }
          return result;
        }
      };
    }
  });
});

describe("Custom matcher", function() {
  it("should check if a number is greater than 10", function() {
    expect(15).toBeGreaterThanTen();  // এটি পাস হবে
    expect(5).toBeGreaterThanTen();   // এটি ফেল হবে
  });
});

২. toContainString Custom Matcher

এই matcher টি একটি স্ট্রিংকে পরীক্ষা করবে যে সেটি অন্য একটি স্ট্রিং ধারণ করছে কি না।

beforeEach(function() {
  jasmine.addMatchers({
    toContainString: function() {
      return {
        compare: function(actual, expected) {
          const result = {};
          result.pass = actual.includes(expected);
          if (result.pass) {
            result.message = `Expected "${actual}" to contain "${expected}".`;
          } else {
            result.message = `Expected "${actual}" to contain "${expected}", but it does not.`;
          }
          return result;
        }
      };
    }
  });
});

describe("Custom matcher", function() {
  it("should check if a string contains another string", function() {
    expect("Hello World").toContainString("Hello");  // এটি পাস হবে
    expect("Hello World").toContainString("world");  // এটি ফেল হবে, কারণ "world" lowercase
  });
});

এখানে:

  • toContainString() matcher টি যাচাই করছে যে একটি স্ট্রিং অন্য একটি স্ট্রিং ধারণ করছে কি না, এবং এটি case-sensitive।

Jasmine এর Built-in Matchers এর সাথে Custom Matchers

আপনি Custom Matchers তৈরি করার পর, Jasmine এর অন্যান্য built-in matcher গুলোর সাথে এগুলিকে ব্যবহার করতে পারেন। expect() এর মাধ্যমে অন্যান্য matcher গুলোর সাথে সমন্বিতভাবে এগুলি কাজ করবে।

উদাহরণ:

beforeEach(function() {
  jasmine.addMatchers({
    toBeGreaterThanFive: function() {
      return {
        compare: function(actual) {
          const result = {};
          result.pass = actual > 5;
          if (result.pass) {
            result.message = `Expected ${actual} to be greater than 5.`;
          } else {
            result.message = `Expected ${actual} to be greater than 5, but it is not.`;
          }
          return result;
        }
      };
    }
  });
});

describe("Custom matcher", function() {
  it("should combine custom matcher with built-in matchers", function() {
    expect(10).toBeGreaterThanFive().toBeGreaterThan(8);  // এটি পাস হবে
    expect(4).toBeGreaterThanFive().toBeLessThan(8);  // এটি ফেল হবে
  });
});

এখানে:

  • toBeGreaterThanFive() matcher টি যাচাই করছে যে সংখ্যা ৫ এর বেশি কিনা।
  • তারপর, toBeGreaterThan(8) matcher ব্যবহার করা হচ্ছে যাতে যাচাই করা হয় যে সংখ্যাটি ৮ এরও বেশি কিনা।

Custom Matcher এর Limitations

Custom Matchers ব্যবহার করার সময় কিছু সীমাবদ্ধতা হতে পারে, যেমন:

  • Error handling: Custom matcher গুলোতে error handling করা কিছুটা tricky হতে পারে, যদি matcher লজিক সঠিকভাবে না লিখে থাকে।
  • Performance: খুব complex matcher গুলি টেস্টের পারফরম্যান্সে প্রভাব ফেলতে পারে, বিশেষত বড় টেস্ট স্যুটে।

সারাংশ

JasmineJS এর Custom Matchers ব্যবহার করে আপনি নিজের প্রয়োজন অনুযায়ী matcher তৈরি করতে পারেন, যা আপনার টেস্ট কেসে আরো নির্দিষ্ট যাচাই করতে সহায়তা করে। expect.extend() বা jasmine.addMatchers() ব্যবহার করে আপনি নতুন matcher তৈরি করতে পারেন, এবং এগুলি expect() এর মাধ্যমে সহজেই ব্যবহার করা সম্ভব। Jasmine এর built-in matcher গুলোর সাথে কাস্টম matcher গুলিকে মিশিয়ে আরও শক্তিশালী এবং সূক্ষ্ম টেস্ট কেস তৈরি করা যায়।

Content added By

Complex Objects এবং Arrays এর জন্য Matchers

328

JasmineJS এর Matchers ফিচারটি শুধুমাত্র সোজা মান (primitive values) নয়, বরং complex objects এবং arrays এর জন্যও কার্যকর। আপনি যখন জাভাস্ক্রিপ্টের অবজেক্ট, অ্যারে বা অন্যান্য জটিল ডাটা স্ট্রাকচার নিয়ে কাজ করেন, তখন JasmineJS এর বিভিন্ন Matcher ব্যবহার করে সেগুলোর কার্যকারিতা এবং অবস্থা পরীক্ষা করতে পারেন।

JasmineJS এর বিভিন্ন Matcher রয়েছে যা objects এবং arrays এর তুলনা ও যাচাই করতে ব্যবহৃত হয়। এই Matchers গুলি আপনাকে ডাটা স্ট্রাকচারগুলির মধ্যে মান বা উপাদান সমতা এবং উপস্থিতি পরীক্ষা করতে সাহায্য করে।


toEqual() Matcher

toEqual() Matcher একটি অবজেক্ট বা অ্যারের মান সমতা (deep equality) পরীক্ষা করতে ব্যবহৃত হয়। এটি মান এবং তার ভিতরের গঠন (structure) পরীক্ষা করে, তাই এটি দুটি অবজেক্ট বা অ্যারের মধ্যে সমতা যাচাই করতে উপযুক্ত।

উদাহরণ:

describe("toEqual matcher", function() {
  it("should check if two objects are equal", function() {
    const user1 = { name: "Alice", age: 25 };
    const user2 = { name: "Alice", age: 25 };

    expect(user1).toEqual(user2);  // user1 এবং user2 অবজেক্ট দুটি সমান হওয়া উচিত
  });
});

এখানে toEqual() Matcher দুটি অবজেক্ট user1 এবং user2 এর ভিতরের মান এবং গঠন তুলনা করছে, এবং এটি সঠিকভাবে যাচাই করবে যে তারা সমান কিনা।

অ্যারে উদাহরণ:

describe("toEqual matcher with arrays", function() {
  it("should check if two arrays are equal", function() {
    const array1 = [1, 2, 3];
    const array2 = [1, 2, 3];

    expect(array1).toEqual(array2);  // array1 এবং array2 সমান হওয়া উচিত
  });
});

এখানে toEqual() Matcher দুটি অ্যারের মধ্যে মান এবং তাদের সিরিয়াল টানা (sequence) যাচাই করবে।


toContain() Matcher

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

উদাহরণ:

describe("toContain matcher", function() {
  it("should check if an array contains a value", function() {
    const fruits = ["apple", "banana", "orange"];
    expect(fruits).toContain("banana");  // fruits অ্যারেতে "banana" থাকতে হবে
  });
});

এখানে toContain() Matcher যাচাই করছে যে অ্যারে fruits এর মধ্যে "banana" উপাদানটি রয়েছে কিনা।

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

describe("toContain matcher with string", function() {
  it("should check if a string contains a substring", function() {
    const greeting = "Hello, world!";
    expect(greeting).toContain("world");  // greeting স্ট্রিংয়ে "world" থাকতে হবে
  });
});

এখানে toContain() Matcher স্ট্রিংয়ের মধ্যে "world" সাবস্ট্রিংয়ের উপস্থিতি যাচাই করছে।


toBeDefined() Matcher

toBeDefined() Matcher একটি মান পরীক্ষা করে যে তা undefined নয়। এটি বিশেষভাবে ব্যবহৃত হয় যখন আপনি নিশ্চিত হতে চান যে একটি অবজেক্টের প্রপার্টি বা একটি অ্যারে উপাদান বর্তমান রয়েছে।

উদাহরণ:

describe("toBeDefined matcher", function() {
  it("should check if a property is defined in an object", function() {
    const user = { name: "Alice", age: 25 };
    expect(user.name).toBeDefined();  // user.name অবশ্যই defined (undefined নয়)
  });
});

এখানে toBeDefined() Matcher যাচাই করছে যে user.name প্রপার্টি undefined নয়, অর্থাৎ সেটি আসলেই সংজ্ঞায়িত (defined)।


toHaveBeenCalledWith() Matcher

toHaveBeenCalledWith() Matcher টেস্ট করার জন্য ব্যবহৃত হয় যে, একটি স্পাই করা ফাংশন কল হয়েছে কিনা এবং সেই কলটি সঠিক আর্গুমেন্ট সহ হয়েছে কিনা। এটি অবজেক্ট বা অ্যারে এর মত complex ডাটা নিয়ে কাজ করার জন্যও খুবই উপযোগী।

উদাহরণ:

describe("toHaveBeenCalledWith matcher", function() {
  it("should check if a function has been called with specific arguments", function() {
    const user = {
      greet: function(name, age) {
        return `Hello, ${name}, you are ${age} years old.`;
      }
    };

    spyOn(user, 'greet');  // greet মেথডটি স্পাই করা হচ্ছে
    user.greet("Alice", 25);

    expect(user.greet).toHaveBeenCalledWith("Alice", 25);  // greet মেথডটি ঠিক আর্গুমেন্টের সাথে কল হয়েছে কিনা যাচাই
  });
});

এখানে toHaveBeenCalledWith() Matcher যাচাই করছে যে user.greet মেথডটি "Alice" এবং 25 আর্গুমেন্ট সহ কল হয়েছে।


toMatch() Matcher (Objects and Arrays)

toMatch() Matcher সাধারণত রেগুলার এক্সপ্রেশন (RegEx) পরীক্ষা করার জন্য ব্যবহৃত হয়, তবে এটি complex objects এবং arrays এ মেলানোর জন্যও ব্যবহার করা যেতে পারে। যখন আপনি কোনো অবজেক্টের বা অ্যারের বৈশিষ্ট্য রেগুলার এক্সপ্রেশন দিয়ে পরীক্ষা করতে চান, তখন এটি ব্যবহার করা হয়।

উদাহরণ:

describe("toMatch matcher", function() {
  it("should check if an array contains an item matching a pattern", function() {
    const users = ["alice@example.com", "bob@example.com", "charlie@example.net"];
    expect(users).toMatch(/example.com/);  // অ্যারেতে "example.com" থাকা উচিত
  });
});

এখানে toMatch() Matcher অ্যারেতে "example.com" থাকা উপাদানটি পরীক্ষা করছে, রেগুলার এক্সপ্রেশন দিয়ে।


সারাংশ

JasmineJS এ complex objects এবং arrays এর জন্য কিছু বিশেষ Matcher রয়েছে যা আপনাকে আপনার কোডের গঠন ও মান পরীক্ষা করতে সহায়তা করে। মূল Matchers গুলোর মধ্যে রয়েছে:

  • toEqual(): অবজেক্ট এবং অ্যারে সমতা পরীক্ষা।
  • toContain(): অ্যারে বা স্ট্রিংয়ের মধ্যে উপাদান উপস্থিতি পরীক্ষা।
  • toBeDefined(): অবজেক্টের প্রপার্টি বা অ্যারে উপাদান সংজ্ঞায়িত (defined) কিনা পরীক্ষা।
  • toHaveBeenCalledWith(): স্পাই করা ফাংশন সঠিক আর্গুমেন্ট সহ কল হয়েছে কিনা যাচাই।
  • toMatch(): রেগুলার এক্সপ্রেশন দিয়ে স্ট্রিং বা অ্যারে যাচাই।

এই Matchers গুলি ব্যবহার করে আপনি অবজেক্ট এবং অ্যারে ভিত্তিক জটিল ডাটা স্ট্রাকচারের কার্যকারিতা সহজে পরীক্ষা করতে পারবেন।

Content added By

Custom Matchers এর জন্য Best Practices

332

JasmineJS এ custom matchers তৈরি করা সম্ভব, যা আপনার টেস্ট কেসগুলোর জন্য নির্দিষ্ট এবং প্রয়োজনীয় যাচাইকরণ যুক্ত করতে সাহায্য করে। Custom matchers তৈরি করা আপনাকে আরো স্পেসিফিক এবং কাস্টম টেস্টিং লজিক প্রয়োগ করতে সহায়তা করে। এই ধরনের matchers বিশেষভাবে উপকারী যখন আপনি পুনরায় ব্যবহৃত যাচাইকরণ বা লজিক প্রয়োজন হয়। তবে, সঠিকভাবে custom matchers তৈরি এবং ব্যবহার করার জন্য কিছু best practices অনুসরণ করা গুরুত্বপূর্ণ।


1. Clear এবং Concise Matcher নাম নির্বাচন করুন

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

উদাহরণ:

  • সঠিক নাম: toBeEvenNumber(), toBePositive()
  • ভুল নাম: checkEven(), validatePositive()
// সঠিক উদাহরণ:
expect(4).toBeEvenNumber();

এখানে, toBeEvenNumber() নামটি স্পষ্টভাবে বুঝাচ্ছে যে এটি সংখ্যার even (যুগ্ম) হতে যাচাই করছে।


2. Matcher ফাংশনটি সিম্পল এবং স্পষ্ট রাখুন

Custom matcher এর ভিতরের লজিকটি যতটা সম্ভব সহজ এবং পরিষ্কার রাখুন। এটি আপনার কোডের রিডেবিলিটি বাড়াবে এবং পরবর্তীতে ডিবাগ করা সহজ করবে।

উদাহরণ:

beforeEach(function() {
  jasmine.addMatchers({
    toBeEvenNumber: function() {
      return {
        compare: function(actual) {
          const result = {};
          result.pass = actual % 2 === 0;
          result.message = result.pass ? 
            `${actual} is an even number` : 
            `${actual} is not an even number`;
          return result;
        }
      };
    }
  });
});

it("should check if the number is even", function() {
  expect(4).toBeEvenNumber();  // সঠিক
  expect(3).toBeEvenNumber();  // ভুল
});

এখানে, matcher খুব সহজ এবং পরিষ্কারভাবে একটি সংখ্যার even বা odd থাকা যাচাই করছে।


3. Custom Matcher কে Jasmine addMatchers() দিয়ে রেজিস্টার করুন

JasmineJS এ custom matcher রেজিস্টার করার জন্য jasmine.addMatchers() মেথডটি ব্যবহার করা হয়। এটি আপনার custom matchers কে Jasmine এর সাথে যুক্ত করে।

উদাহরণ:

beforeEach(function() {
  jasmine.addMatchers({
    toBePositive: function() {
      return {
        compare: function(actual) {
          const result = {};
          result.pass = actual > 0;
          result.message = result.pass ? 
            `${actual} is a positive number` : 
            `${actual} is not a positive number`;
          return result;
        }
      };
    }
  });
});

এখানে, toBePositive নামক custom matcher টি beforeEach() ব্লকের মধ্যে রেজিস্টার করা হয়েছে। এটি প্রতিটি টেস্টের আগে অ্যাক্সেসযোগ্য হবে।


4. বিভিন্ন ধরণের ইনপুট পরীক্ষা করুন

Custom matcher তৈরি করার সময়, আপনার matcher যেন বিভিন্ন ধরণের ইনপুটের জন্য সঠিকভাবে কাজ করে, সে ব্যাপারে নিশ্চিত হন। উদাহরণস্বরূপ, সংখ্যা, স্ট্রিং, বা অবজেক্টের ক্ষেত্রে বিভিন্ন ফলাফল যাচাই করা জরুরি।

উদাহরণ:

beforeEach(function() {
  jasmine.addMatchers({
    toBeNonEmptyString: function() {
      return {
        compare: function(actual) {
          const result = {};
          result.pass = typeof actual === 'string' && actual.trim() !== '';
          result.message = result.pass ? 
            `"${actual}" is a non-empty string` : 
            `"${actual}" is not a non-empty string`;
          return result;
        }
      };
    }
  });
});

it("should check if the string is non-empty", function() {
  expect("Hello").toBeNonEmptyString();  // সঠিক
  expect("   ").toBeNonEmptyString();    // ভুল
});

এখানে, matcherটি স্ট্রিং টাইপের ইনপুট নিয়ে যাচাই করছে এবং সঠিকভাবে empty স্ট্রিংও শনাক্ত করছে।


5. উপযুক্ত এবং স্পষ্ট মেসেজ প্রদান করুন

Custom matcher ব্যবহার করার সময় উপযুক্ত এবং স্পষ্ট মেসেজ প্রদান করা খুব গুরুত্বপূর্ণ, যাতে টেস্ট ফেইল হলে দ্রুত সমস্যার সমাধান করা যায়। Jasmine এর message প্রোপার্টি ব্যবহার করে আপনি এই মেসেজ প্রদান করতে পারেন।

উদাহরণ:

beforeEach(function() {
  jasmine.addMatchers({
    toBePositive: function() {
      return {
        compare: function(actual) {
          const result = {};
          result.pass = actual > 0;
          result.message = result.pass ? 
            `${actual} is a positive number` : 
            `${actual} is not a positive number`;
          return result;
        }
      };
    }
  });
});

it("should display the correct message", function() {
  const result = expect(5).toBePositive();
  expect(result.message).toBe("5 is a positive number");

  const result2 = expect(-3).toBePositive();
  expect(result2.message).toBe("-3 is not a positive number");
});

এখানে, যদি matcherটি ফেইল করে, তখন Jasmine নির্দিষ্ট করে জানাবে কেন টেস্টটি ব্যর্থ হয়েছে, যেমন "5 is not a positive number"।


6. Custom Matcher টেস্ট করুন

Custom matcher তৈরি করার পর, অবশ্যই এর কাজের সঠিকতা পরীক্ষা করুন। matcher টেস্ট করার সময় নিশ্চিত করুন যে এটি সঠিকভাবে কাজ করছে এবং প্রত্যাশিত ফলাফল প্রদান করছে।

উদাহরণ:

beforeEach(function() {
  jasmine.addMatchers({
    toBeEvenNumber: function() {
      return {
        compare: function(actual) {
          const result = {};
          result.pass = actual % 2 === 0;
          result.message = result.pass ? 
            `${actual} is an even number` : 
            `${actual} is not an even number`;
          return result;
        }
      };
    }
  });
});

it("should correctly check if a number is even", function() {
  expect(4).toBeEvenNumber();
  expect(3).not.toBeEvenNumber();
});

এখানে, আমরা সঠিকভাবে even number এবং odd number এর জন্য matcher যাচাই করেছি।


7. Reuseability এর কথা ভাবুন

Custom matchers তৈরি করার সময় তাদের reuseable (পুনঃব্যবহারযোগ্য) এবং modular (মডুলার) রাখতে চেষ্টা করুন। একে একাধিক টেস্টে ব্যবহার করার জন্য তৈরি করুন, যাতে আপনার টেস্ট কেসগুলো আরো সংক্ষিপ্ত এবং কার্যকর হয়।

উদাহরণ:

beforeEach(function() {
  jasmine.addMatchers({
    toBeWithinRange: function() {
      return {
        compare: function(actual, min, max) {
          const result = {};
          result.pass = actual >= min && actual <= max;
          result.message = result.pass ? 
            `${actual} is within the range ${min} - ${max}` : 
            `${actual} is not within the range ${min} - ${max}`;
          return result;
        }
      };
    }
  });
});

it("should check if number is within range", function() {
  expect(10).toBeWithinRange(5, 15);  // সঠিক
  expect(20).not.toBeWithinRange(5, 15);  // ভুল
});

এখানে, toBeWithinRange() matcher টির মাধ্যমে বিভিন্ন টেস্ট কেসে নির্দিষ্ট একটি রেঞ্জের মধ্যে মান থাকা যাচাই করা হচ্ছে।


সারাংশ

JasmineJS এ custom matchers ব্যবহার করার সময় কিছু গুরুত্বপূর্ণ best practices অনুসরণ করা উচিত:

  • স্পষ্ট নাম নির্বাচন: Matcher নামটি স্পষ্ট এবং বোধগম্য হওয়া উচিত।
  • সরল এবং পরিষ্কার লজিক: Matcher ফাংশনটি সহজ এবং পরিষ্কার হওয়া উচিত।
  • মেসেজ প্রদান: যখন matcher ফেইল করে, তখন স্পষ্ট এবং বোধগম্য মেসেজ দেওয়া উচিত।
  • রিইউজেবল কোড: Custom matcher গুলো যাতে বিভিন্ন টেস্টে ব্যবহার করা যায়, তা নিশ্চিত করুন।
  • ইনপুট যাচাই: matcherটি যেন বিভিন্ন ধরণের ইনপুটের জন্য সঠিক কাজ করে তা নিশ্চিত করুন।

এই best practices গুলি অনুসরণ করলে আপনার custom matchers আরো কার্যকরী এবং রিডেবল হবে, যা আপনার Jasmine টেস্টিং প্রক্রিয়াকে আরও শক্তিশালী করবে।

Content added By
Promotion

Are you sure to start over?

Loading...