[javascript] Jest에서 발생하는 예외 유형을 테스트하는 방법

함수에 의해 throw 된 예외 유형을 테스트 해야하는 코드를 사용하고 있습니다 (TypeError, ReferenceError 등).

현재 테스트 프레임 워크는 AVA이며 다음과 같이 두 번째 인수 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');
});

Jest에 테스트를 다시 작성하기 시작했으며 쉽게 수행하는 방법을 찾지 못했습니다. 가능합니까?



답변

Jest에서는 함수를 expect (function) .toThrow (공백 또는 오류 유형)에 전달해야합니다.

예:

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

기존 함수가 인수 세트로 처리되는지 여부를 테스트해야하는 경우 expect ()의 익명 함수로 랩핑해야합니다.

예:

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


답변

조금 이상하지만 작동하지만 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블록 예외를 잡으면 제기 된 테스트 할 수 있습니다 Error. 이상한이 expect(true).toBe(false);예상되는 경우 테스트에 실패 할 필요가 Error발생되지 않습니다. 그렇지 않으면이 라인에 도달 할 수 없습니다 ( Error앞에 제기해야 함).

편집 : @ Kenny Body는 사용하면 코드 품질을 향상시키는 더 나은 솔루션을 제안합니다 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");
  }
});

자세한 설명과 함께 원래 답변을 참조하십시오 : Jest에서 예외 유형을 테스트하는 방법


답변

약간 더 간결한 버전을 사용합니다.

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


답변

Jest에 대한 (제한적이지만) 노출 expect().toThrow()에서 특정 유형의 오류가 발생했는지 테스트하려는 경우에 적합한 것으로 나타났습니다 .

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

또는 특정 메시지와 함께 오류가 발생합니다.

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

둘 다하려고하면 오 탐지를 얻게됩니다. 예를 들어 코드가 throw RangeError('Something bad happened!')되면이 테스트는 다음을 통과합니다.

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

시도를 사용하여 제안 bodolsog에 의한 대답은 / 캐치 대신 사용할 수있는, 가까운, 오히려 사실 기대보다가 캐치의 주장이 충돌하는 기대 보장하기 위해 허위로 expect.assertions(2)테스트의 시작에 2기대 주장의 수는 . 나는 이것이 테스트의 의도를보다 정확하게 설명한다고 생각합니다.

오류의 유형 및 메시지를 테스트하는 전체 예 :

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)테스트는 실패하고 테스트는 실패합니다.


답변

직접 시도하지는 않았지만 Jest의 toThrow 어설 션을 사용하는 것이 좋습니다 . 따라서 귀하의 예는 다음과 같이 보일 것입니다.

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);
});

다시 테스트하지는 않았지만 제대로 작동한다고 생각합니다.


답변

Jest에는 toThrow(error)함수가 호출 될 때 발생하는지 테스트 하는 메소드 가 있습니다.

따라서 귀하의 경우에는 다음과 같이 전화해야합니다.

expect(t).toThrowError(TypeError);

문서


답변

현대식 농담을 사용하면 거부 된 가치를 더 많이 확인할 수 있습니다. 예를 들면 다음과 같습니다.

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,
  }