함수에 의해 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,
}