Estoy tratando de escribir una prueba para Jasmine Test Framework que espera un error. En este momento estoy usando una integración Jasmine Node.js de GitHub .
En mi módulo Node tengo el siguiente código:
throw new Error("Parsing is not possible");
Ahora trato de escribir una prueba que espera este error:
describe('my suite...', function() {
[..]
it('should not parse foo', function() {
[..]
expect(parser.parse(raw)).toThrow(new Error("Parsing is not possible"));
});
});
También probé Error()
y algunas otras variantes y simplemente no puedo entender cómo hacerlo funcionar.
javascript
testing
node.js
jasmine
echox
fuente
fuente
Function.bind
: stackoverflow.com/a/13233194/294855Respuestas:
deberías pasar una función a la
expect(...)
llamada. El código que tienes aquí:está intentando llamar realmente
parser.parse(raw)
en un intento de pasar el resultado aexpect(...)
,Intente usar una función anónima en su lugar:
fuente
expect(parser.parse).toThrow(...)
expect(blah).toThrow()
. Sin argumentos significa comprobar para ver si arroja algo. No se requiere coincidencia de cadenas. Ver también: stackoverflow.com/a/9525172/1804678parser.parse
usathis
, pasarlo sin contexto producirá resultados inesperados. Podrías pasarparser.parse.bind(parser)
, pero honestamente ... una función anónima sería más elegante.Tu estas usando:
Pero si observa el comentario de la función (se espera que sea una cadena):
Supongo que probablemente deberías escribirlo así (usando lambda - función anónima):
Esto se confirma en el siguiente ejemplo:
Douglas Crockford recomienda encarecidamente este enfoque, en lugar de usar "throw new Error ()" (forma de creación de prototipos):
fuente
Error
( jsfiddle.net/k1mxey8j ). Sin embargo, su objeto lanzado, por supuesto, no tendrá la.stack
propiedad, lo que puede ser importante si desea configurar informes automáticos de errores.Una solución más elegante que crear una función anónima cuyo único propósito es envolver otra es usar la
bind
función es5 . La función de vinculación crea una nueva función que, cuando se llama, tiene suthis
palabra clave establecida en el valor proporcionado, con una secuencia dada de argumentos que precede a cualquier proporcionada cuando se llama a la nueva función.En vez 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");
La sintaxis de enlace le permite probar funciones con diferentes
this
valores y, en mi opinión, hace que la prueba sea más legible. Ver también: https://stackoverflow.com/a/13233194/1248889fuente
Reemplazo el emparejador toThrow de Jasmine con lo siguiente, que le permite coincidir con la propiedad del nombre de la excepción o su propiedad de mensaje. Para mí, esto hace que las pruebas sean más fáciles de escribir y menos frágiles, ya que puedo hacer lo siguiente:
y luego prueba con lo siguiente:
Esto me permite ajustar el mensaje de excepción más tarde sin romper las pruebas, cuando lo importante es que arrojó el tipo de excepción esperado.
Este es el reemplazo de toThrow que permite esto:
fuente
expect(blah).toThrow()
. Sin argumentos significa comprobar para ver si arroja algo. No se requiere coincidencia de cadenas. Ver también: stackoverflow.com/a/9525172/1804678Como se mencionó anteriormente, es necesario pasar una función,
toThrow
ya que es la función que está describiendo en su prueba: "Espero que esta función arroje x"Si usa Jasmine-Matchers , también puede usar uno de los siguientes cuando se adapten a la situación;
o
fuente
expect(foo).toThrowError(TypeError);
en Jasmine 2.5: jasmine.github.io/2.5/introductionSé que es más código pero también puedes hacer:
fuente
Para los amantes del café
fuente
Para cualquiera que todavía pueda estar enfrentando este problema, para mí la solución publicada no funcionó y siguió arrojando este error:
Error: Expected function to throw an exception.
más tarde me di cuenta de que la función que esperaba lanzar un error era una función asincrónica y esperaba prometer ser rechazado y luego arrojar error y eso es lo que estaba haciendo en mi código:y eso fue lo que hice en mi prueba y funcionó:
fuente
expectAsync
jasmine.github.io/api/3.3/async-matchers.html