Из моего (хотя и ограниченного) знакомства с Jest я обнаружил, что expect().toThrow()
это подходит, если вы хотите ТОЛЬКО проверить, выдается ли ошибка определенного типа:
expect(() => functionUnderTest()).toThrow(TypeError);
ИЛИ выдается ошибка с конкретным сообщением:
expect(() => functionUnderTest()).toThrow('Something bad happened!');
Если вы попытаетесь сделать оба, вы получите ложное срабатывание. Например, если ваш код выдает ошибку RangeError('Something bad happened!')
, этот тест пройдет:
expect(() => functionUnderTest()).toThrow(new TypeError('Something bad happened!'));
Ответ bodolsog, предлагающий использовать try / catch, близок, но вместо того, чтобы ожидать, что истина будет ложной, чтобы гарантировать, что ожидаемые утверждения в catch будут выполнены, вы можете вместо этого использовать 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)
не будут выполнены и тест не пройден.