Pela minha exposição (ainda que limitada) ao Jest, achei expect().toThrow()
adequado se você deseja SOMENTE testar um erro de um tipo específico:
expect(() => functionUnderTest()).toThrow(TypeError);
OU um erro é gerado com uma mensagem específica:
expect(() => functionUnderTest()).toThrow('Something bad happened!');
Se você tentar fazer as duas coisas, receberá um falso positivo. Por exemplo, se seu código for lançado RangeError('Something bad happened!')
, este teste será aprovado:
expect(() => functionUnderTest()).toThrow(new TypeError('Something bad happened!'));
A resposta do bodolsog que sugere o uso de uma tentativa / captura está próxima, mas, em vez de esperar que true seja falso para garantir que as asserções esperadas na captura sejam atingidas, você pode usar expect.assertions(2)
no início do seu teste, onde 2
está o número de asserções esperadas . Eu sinto que isso descreve com mais precisão a intenção do teste.
Exemplo completo de teste do tipo E mensagem de um erro:
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!');
}
});
});
Se functionUnderTest()
NÃO gerar um erro, as afirmações serão atingidas, mas oexpect.assertions(2)
falha e o teste falharão.