私の(限定的ではあるが)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!'));
try / catchの使用を提案するbodolsogによる回答は近いですが、trueがfalseであると期待して、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)
は失敗し、テストは失敗します。