从我(虽然有限制)接触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的建议使用try / catch的答案很接近,但是与其期望true为假以确保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)
将失败并且测试将失败。