জেস্টে কীভাবে নিক্ষিপ্ত ব্যতিক্রম পরীক্ষা করা যায়


161

আমি এমন কিছু কোড নিয়ে কাজ করছি যেখানে আমার ফাংশন দ্বারা ছুঁড়ে দেওয়া ধরণের ব্যতিক্রমের পরীক্ষা করা দরকার (এটি কি টাইপআরর, রেফারেন্স এরর ইত্যাদি)।

আমার বর্তমান পরীক্ষার কাঠামোটি এভিএ এবং আমি এটি t.throwsএখানে দ্বিতীয় মত যুক্তি হিসাবে পরীক্ষা করতে পারি :

it('should throw Error with message \'UNKNOWN ERROR\' when no params were passed', (t) => {
  const error = t.throws(() => {
    throwError();
  }, TypeError);

  t.is(error.message, 'UNKNOWN ERROR');
});

আমি জেস্টে আমার পরীক্ষাগুলি আবার লিখতে শুরু করেছি এবং কীভাবে সহজে এটি করা যায় তা খুঁজে পেলাম না। এটা কি সম্ভব?

উত্তর:


225

জেস্টে আপনাকে কোনও ফাংশন প্রত্যাশায় (ফাংশন) পাস করতে হবে। টুথ্রো (ফাঁকা বা ত্রুটির ধরণ)।

উদাহরণ:

test("Test description", () => {
  const t = () => {
    throw new TypeError();
  };
  expect(t).toThrow(TypeError);
});

যদি আপনার কোনও বিদ্যমান ক্রিয়াকলাপটি যদি এটি আর্গুমেন্টের সেট দিয়ে ছুঁড়ে দেয় কিনা তা পরীক্ষা করতে হয়, আপনাকে প্রত্যাশায় এটি একটি বেনামে ফাংশনটির মধ্যে আবদ্ধ করতে হবে।

উদাহরণ:

test("Test description", () => {
  expect(() => {http.get(yourUrl, yourCallbackFn)}).toThrow(TypeError);
});

79

অল্প অদ্ভুত, কিন্তু কাজ এবং imho ভাল পাঠযোগ্য:

it('should throw Error with message \'UNKNOWN ERROR\' when no params were passed', () => {
  try {
      throwError();
      // Fail test if above expression doesn't throw anything.
      expect(true).toBe(false);
  } catch (e) {
      expect(e.message).toBe("UNKNOWN ERROR");
  }
});

Catchআপনার ব্যতিক্রমটিকে অবরুদ্ধ করুন, তারপরে আপনি নিজের উত্থাপিত বিষয়ে পরীক্ষা করতে পারবেন Errorexpect(true).toBe(false);আপনার পরীক্ষায় ব্যর্থ হওয়ার জন্য অদ্ভুত প্রয়োজন যদি প্রত্যাশিত Errorনিক্ষেপ করা হয় না। অন্যথায়, এই লাইনটি কখনই পৌঁছানো যায় না ( Errorতাদের আগে উত্থাপন করা উচিত)।

সম্পাদনা করুন: @ কেনি বডি আরও ভাল সমাধানের প্রস্তাব দেয় যা কোনও কোডের মান উন্নত করে যদি আপনি ব্যবহার করেন expect.assertions()

it('should throw Error with message \'UNKNOWN ERROR\' when no params were passed', () => {
  expect.assertions(1);
  try {
      throwError();
  } catch (e) {
      expect(e.message).toBe("UNKNOWN ERROR");
  }
});

আরও ব্যাখ্যা সহ আসল উত্তরটি দেখুন: জেস্টে কীভাবে নিক্ষিপ্ত ব্যতিক্রম পরীক্ষা করা যায়


18
ব্যতিক্রমগুলির জন্য পরীক্ষার এটি একটি খুব কার্যকরী উপায় যখন জেস্ট ইতিমধ্যে প্রত্যাশা করেছে to ব্যতিক্রমগুলি যাচাইয়ের পদ্ধতি (টোট্রো): jestjs.io/docs/en/expect.html#tothrowerror
gomisha

4
হ্যাঁ, তবে এটি কেবল টাইপ করে পরীক্ষা করে, বার্তা বা অন্যান্য সামগ্রী নয় এবং প্রশ্নটি পরীক্ষার বার্তা সম্পর্কে ছিল, টাইপ নয়।
বোডলসগ

2
Hah। সত্যিই এটির মতোই আমার কোডটি নিক্ষিপ্ত ত্রুটির একটি মূল্য পরীক্ষা করতে হবে সুতরাং আমার উদাহরণটি দরকার। আমি ত্রুটিযুক্ত প্রত্যাশা যেমন expect('here').not.toBe('here');কেবল মজা করার জন্য লিখব :-)
ভ্যালারি

4
@ ভ্যালারি বা: expect('to be').not.toBe('to be')শেক্সপিয়র স্টাইলে।
মিচিয়েল ভ্যান ডার ব্লঙ্ক

2
সবচেয়ে আন্ডাররেটেড উত্তর!
এডউইন ইকেচুকু ওকনকো

41

আমি আরও কিছুটা সংক্ষিপ্ত সংস্করণ ব্যবহার করেছি:

expect(() => {
  //code block that should throw error
}).toThrow(TypeError) //or .toThrow('expectedErrorMessage')

2
সংক্ষিপ্ত এবং সুনির্দিষ্ট
ফ্ল্যাপজ্যাক

33

জেস্টের কাছে আমার (সীমাবদ্ধ সত্ত্বেও) এক্সপোজার থেকে, আমি খুঁজে পেয়েছি যে expect().toThrow()উপযুক্ত যদি আপনি কেবল পরীক্ষা করতে চান তবে একটি নির্দিষ্ট ধরণের একটি ত্রুটি নিক্ষেপ করা হয়:

expect(() => functionUnderTest()).toThrow(TypeError);

অথবা একটি নির্দিষ্ট বার্তা দিয়ে একটি ত্রুটি নিক্ষেপ করা হয়েছে:

expect(() => functionUnderTest()).toThrow('Something bad happened!');

যদি আপনি উভয়ই করার চেষ্টা করেন তবে আপনি একটি মিথ্যা ইতিবাচক পাবেন। উদাহরণস্বরূপ, যদি আপনার কোড ছুড়ে দেয় RangeError('Something bad happened!'), এই পরীক্ষাটি পাস করবে:

expect(() => functionUnderTest()).toThrow(new TypeError('Something bad happened!'));

বোডলসগের উত্তর যা চেষ্টা / ক্যাচ ব্যবহারের পরামর্শ দেয় তা নিকটবর্তী, তবে প্রত্যাশার জোরে ধরা পড়েছে তা নিশ্চিত করতে সত্য বলে মিথ্যা প্রত্যাশার চেয়ে আপনি তার পরিবর্তে expect.assertions(2)আপনার পরীক্ষার শুরুতে ব্যবহার করতে পারেন যেখানে 2প্রত্যাশিত দৃser়সংখ্যার সংখ্যা । আমি এটিকে আরও নিখুঁতভাবে পরীক্ষার অভিপ্রায় বর্ণনা করে অনুভব করি।

ত্রুটির ধরণ এবং বার্তা পরীক্ষা করার সম্পূর্ণ উদাহরণ:

describe('functionUnderTest', () => {
    it('should throw a specific type of error.', () => {
        expect.assertions(2);

        try {
            functionUnderTest();
        } catch (error) {
            expect(error).toBeInstanceOf(TypeError);
            expect(error).toHaveProperty('message', 'Something bad happened!');
        }
    }); 
});

যদি functionUnderTest()কোনও ত্রুটি না ফেলে তবে দৃ .়ভাবে আঘাত হানা যাবে তবে expect.assertions(2)ব্যর্থ হবে এবং পরীক্ষা ব্যর্থ হবে।


ডি ওহ। আমি জাস্টের প্রত্যাশিত একাধিক দাবি বৈশিষ্ট্যটি সম্পর্কে সর্বদা ভুলে যাই (সম্ভবত আমি ব্যক্তিগতভাবে এটি সর্বাধিক স্বজ্ঞাত হিসাবে খুঁজে পাই না, তবে এটি অবশ্যই এই জাতীয় ক্ষেত্রে ব্যবহার করে!) চিয়ার্স!
কেপললক

এটি আমার পক্ষে পুরোপুরি ঠিকঠাক কাজ করেছে। এটি ব্যবহার করা উচিত।
অঙ্কিত তান্না

expect.hasAssertions()পরীক্ষার বাইরের কোনও দৃser়তা না থাকলে আরও ভাল বিকল্প হতে পারে catch, কারণ আপনি যদি জোড় যুক্ত / সরিয়ে ফেলেন তবে আপনাকে নম্বরটি আপডেট করতে হবে না।
আন্দ্রে সাসি

12

এটি নিজে চেষ্টা করে দেখেনি তবে আমি জেস্টের ট্রো অ্যাড্রেসেশনটি ব্যবহার করার পরামর্শ দেব । সুতরাং আমি অনুমান করি আপনার উদাহরণটি এরকম কিছু দেখবে:

it('should throw Error with message \'UNKNOWN ERROR\' when no params were passed', (t) => {
  const error = t.throws(() => {
    throwError();
  }, TypeError);

  expect(t).toThrowError('UNKNOWN ERROR');
  //or
  expect(t).toThrowError(TypeError);
});

আবার, এটি পরীক্ষা করে দেখেনি তবে আমি মনে করি এটি কাজ করা উচিত।


8

জাস্টের একটি toThrow(error)পরীক্ষা করার জন্য একটি পদ্ধতি রয়েছে যা ডাকা হয় যখন একটি ফাংশন নিক্ষেপ করে।

সুতরাং, আপনার ক্ষেত্রে আপনার এটি কল করা উচিত:

expect(t).toThrowError(TypeError);

ডকস


1
এটি মামলার জন্য কাজ করবে না: jest.spyOn(service, 'create').mockImplementation(() => { throw new Error(); });যদি উপহাস পদ্ধতিটি createনা হয় async
সের্গেই

7

আধুনিক ঠাট্টা আপনাকে প্রত্যাখ্যানিত মানের আরও চেক করতে দেয়। উদাহরণ স্বরূপ:

const request = Promise.reject({statusCode: 404})
await expect(request).rejects.toMatchObject({ statusCode: 500 });

ত্রুটি সহ ব্যর্থ হবে

Error: expect(received).rejects.toMatchObject(expected)

- Expected
+ Received

  Object {
-   "statusCode": 500,
+   "statusCode": 404,
  }

6

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

function concatStr(str1, str2) {
  const isStr1 = str1 === null
  const isStr2 = str2 === null
  if(isStr1 || isStr2) {
    throw "Parameters can't be null"
  }
  ... // continue your code

আপনার পরীক্ষা

describe("errors", () => {
  it("should error if any is null", () => {
    // notice that the expect has a function that returns the function under test
    expect(() => concatStr(null, "test")).toThrow()
  })
})


3

আমি আমাদের পরীক্ষা-ব্যবহারের লাইব্রেরির জন্য একটি সুবিধাদির পদ্ধতি লিখেছি

/**
 *  Utility method to test for a specific error class and message in Jest
 * @param {fn, expectedErrorClass, expectedErrorMessage }
 * @example   failTest({
      fn: () => {
        return new MyObject({
          param: 'stuff'
        })
      },
      expectedErrorClass: MyError,
      expectedErrorMessage: 'stuff not yet implemented'
    })
 */
  failTest: ({ fn, expectedErrorClass, expectedErrorMessage }) => {
    try {
      fn()
      expect(true).toBeFalsy()
    } catch (err) {
      let isExpectedErr = err instanceof expectedErrorClass
      expect(isExpectedErr).toBeTruthy()
      expect(err.message).toBe(expectedErrorMessage)
    }
  }

জেসস্টের নিজস্ব বৈশিষ্ট্যগুলি ব্যবহার করে একই কাজ করা যেতে পারে। এটি কীভাবে করা যায় তার জন্য আমার উত্তর দেখুন - stackoverflow.com/a/58103698/3361387
কেনি বডি

3

পিটার ড্যানিসের পোস্টে কেবল তার সমাধানের অংশটির উপর জোর দিতে চেয়েছিলেন "[কোনও ক্রম] প্রত্যাশায় (ফাংশন)। টোটো (ফাঁকা বা ত্রুটির ধরণ)" এর সাথে জড়িত solution

জেস্টে, আপনি যখন কোনও মামলার পরীক্ষা করেন যেখানে কোনও ত্রুটি নিক্ষেপ করা উচিত তখন পরীক্ষার অধীনে আপনার প্রত্যাশা () ফাংশনটি মোড়ানোর মধ্যে আপনাকে কাজ করার জন্য একটি অতিরিক্ত তীর ফাংশন মোড়ানোর স্তর সরবরাহ করতে হবে। অর্থাত

ভুল (তবে বেশিরভাগ মানুষের যৌক্তিক পদ্ধতির):

expect(functionUnderTesting();).toThrow(ErrorTypeOrErrorMessage);

রাইট:

expect(() => { functionUnderTesting(); }).toThrow(ErrorTypeOrErrorMessage);

এটি খুব অদ্ভুত তবে পরীক্ষামূলকভাবে সফলভাবে চালানো উচিত।


1

চেষ্টা
expect(t).rejects.toThrow()


4
কেন try? চেষ্টা নেই - তবে উত্তর দিন answer যদি এই উত্তরটি থাকে তবে দয়া করে আরও বিশদ দিন। আপনি বিদ্যমান উত্তরে কি যুক্ত করছেন?
dwinder

7
আমি মনে করি @ রাজিম বলছিলেন যে আপনার সমাধানটি চেষ্টা করা উচিত, চেষ্টা করে দেখুন না।
টম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.