Estou trabalhando com algum código no qual preciso testar o tipo de exceção gerada pela função (É TypeError, ReferenceError etc.).
Minha estrutura de teste atual é o AVA e posso testá-lo como um segundo t.throws
método de argumento , como aqui:
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');
});
Comecei a reescrever meus testes no Jest e não conseguia descobrir como fazer isso facilmente. Isso é possível?
fonte
expect('here').not.toBe('here');
apenas para a diversão :-)expect('to be').not.toBe('to be')
no estilo Shakespeare.Eu uso uma versão um pouco mais concisa:
fonte
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, onde2
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:
Se
functionUnderTest()
NÃO gerar um erro, as afirmações serão atingidas, mas oexpect.assertions(2)
falha e o teste falharão.fonte
expect.hasAssertions()
pode ser uma alternativa melhor quando o teste não possui asserções externascatch
, porque você não precisa atualizar o número se adicionar / remover asserções.Ainda não tentei, mas eu sugeriria usar a declaração toThrow de Jest . Então, acho que seu exemplo seria algo como isto:
Novamente, não teste, mas acho que deve funcionar.
fonte
O Jest tem um método
toThrow(error)
para testar se uma função é lançada quando é chamada.Portanto, no seu caso, você deve chamar assim:
Os documentos
fonte
jest.spyOn(service, 'create').mockImplementation(() => { throw new Error(); });
se o método zombadocreate
não forasync
.O gracejo moderno permite que você faça mais verificações no valor rejeitado. Por exemplo:
falhará com erro
fonte
A documentação é clara sobre como fazer isso. Digamos que eu tenho uma função que aceita dois parâmetros e gera um erro se um deles for
null
.Seu teste
fonte
Caso você esteja trabalhando com
Promise
s:fonte
Acabei escrevendo um método de conveniência para a nossa biblioteca test-utils
fonte
Além do post de Peter Danis, apenas queria enfatizar a parte de sua solução envolvendo "[passar] uma função para expect (function) .toThrow (espaço em branco ou tipo de erro)".
No Jest, quando você testa um caso em que um erro deve ser gerado, dentro do seu wrapper expect () da função em teste, você precisa fornecer uma camada adicional de wrapper da função de seta para que ele funcione. Ou seja,
Errado (mas a abordagem lógica da maioria das pessoas):
Certo:
É muito estranho, mas deve executar os testes com êxito.
fonte
experimentar
expect(t).rejects.toThrow()
fonte
try
? não há tentativa - mas resposta. Se esta for a resposta, por favor, elabore mais. o que você está adicionando à resposta existente?