Estou tentando escrever um teste para o Jasmine Test Framework que espera um erro. No momento, estou usando uma integração do Jasmine Node.js do GitHub .
No meu módulo Nó, tenho o seguinte código:
throw new Error("Parsing is not possible");
Agora eu tento escrever um teste que espera este erro:
describe('my suite...', function() {
[..]
it('should not parse foo', function() {
[..]
expect(parser.parse(raw)).toThrow(new Error("Parsing is not possible"));
});
});
Eu tentei também Error()
e algumas outras variantes e simplesmente não consigo descobrir como fazê-lo funcionar.
javascript
testing
node.js
jasmine
echox
fonte
fonte
Function.bind
: stackoverflow.com/a/13233194/294855Respostas:
você deve passar uma função para a
expect(...)
chamada. O código que você tem aqui:está tentando realmente ligar
parser.parse(raw)
na tentativa de passar o resultadoexpect(...)
,Tente usar uma função anônima:
fonte
expect(parser.parse).toThrow(...)
expect(blah).toThrow()
. Nenhum argumento significa verificar se ele é lançado. Nenhuma correspondência de sequência é necessária. Veja também: stackoverflow.com/a/9525172/1804678parser.parse
usarthis
, passá-lo sem contexto produzirá resultados inesperados. Você poderia passarparser.parse.bind(parser)
, mas honestamente ... uma função anônima seria mais elegante.Você está usando:
Mas se você der uma olhada no comentário da função (o esperado é string):
Suponho que você provavelmente deva escrever assim (usando a função lambda - anonymous):
Isso é confirmado no exemplo a seguir:
Douglas Crockford recomenda enfaticamente essa abordagem, em vez de usar "throw new Error ()" (forma de prototipagem):
fonte
Error
( jsfiddle.net/k1mxey8j ). No entanto, é claro que seu objeto lançado não terá a.stack
propriedade, o que pode ser importante se você deseja configurar o relatório de erros automatizado .Uma solução mais elegante do que criar uma função anônima, cujo único objetivo é envolver outra, é usar a
bind
função es5 . A função de ligação cria uma nova função que, quando chamada, tem suathis
palavra-chave definida como o valor fornecido, com uma sequência de argumentos fornecida antes de qualquer fornecida quando a nova função é chamada.Ao invés de:
expect(function () { parser.parse(raw, config); } ).toThrow("Parsing is not possible");
Considerar:
expect(parser.parse.bind(parser, raw, config)).toThrow("Parsing is not possible");
A sintaxe de ligação permite testar funções com
this
valores diferentes e, na minha opinião, torna o teste mais legível. Consulte também: https://stackoverflow.com/a/13233194/1248889fonte
Substituo o comparador toThrow do Jasmine pelo seguinte, que permite corresponder na propriedade name da exceção ou na propriedade message. Para mim, isso torna os testes mais fáceis de escrever e menos quebradiços, pois eu posso fazer o seguinte:
e depois teste com o seguinte:
Isso me permite ajustar a mensagem de exceção posteriormente, sem interromper os testes, quando o importante é que ela lançou o tipo de exceção esperado.
Esta é a substituição do toThrow que permite:
fonte
expect(blah).toThrow()
. Nenhum argumento significa verificar se ele é lançado. Nenhuma correspondência de sequência é necessária. Veja também: stackoverflow.com/a/9525172/1804678Como mencionado anteriormente, uma função precisa ser passada para
toThrow
a função que você está descrevendo em seu teste: "Espero que essa função gere x"Se você estiver usando o Jasmine-Matchers, também poderá usar um dos seguintes itens quando eles se adequarem à situação;
ou
fonte
expect(foo).toThrowError(TypeError);
em Jasmine 2,5: jasmine.github.io/2.5/introductionEu sei que é mais código, mas você também pode fazer:
fonte
Para os amantes do café
fonte
Para qualquer um que ainda esteja enfrentando esse problema, para mim a solução postada não funcionou e continuou lançando esse erro: Mais
Error: Expected function to throw an exception.
tarde, percebi que a função que eu esperava lançar um erro era uma função assíncrona e esperava promessa de ser rejeitado e, em seguida, lançar erro e é isso que eu estava fazendo no meu código:e foi o que fiz no meu teste e funcionou:
fonte
expectAsync
jasmine.github.io/api/3.3/async-matchers.html