¿Cómo puedo escribir una prueba que espere que se produzca un 'Error' en Jasmine?
Estoy intentando escribir una prueba para Jasmine Test Framework que espera un error. Por el momento estoy usando una integración Jasmine Node.js de GitHub .
En mi módulo Node.js tengo el siguiente código:
throw new Error("Parsing is not possible");
Ahora intento 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"));
});
});
Probé también Error()
algunas otras variantes y simplemente no sé cómo hacerlo funcionar.
Intente utilizar una función anónima en su lugar:
expect( function(){ parser.parse(raw); } ).toThrow(new Error("Parsing is not possible"));
O usando una lambda:
expect( () => parser.parse(raw) ).toThrow(new Error("Parsing is not possible"));
deberías pasar una función a la expect(...)
llamada. Tu código incorrecto:
// incorrect:
expect(parser.parse(raw)).toThrow(new Error("Parsing is not possible"));
está intentando llamar parser.parse(raw)
en un intento de pasar el resultado a expect(...)
,
Tu estas usando:
expect(fn).toThrow(e)
Pero si echas un vistazo al comentario de la función (se espera una cadena):
294 /**
295 * Matcher that checks that the expected exception was thrown by the actual.
296 *
297 * @param {String} expected
298 */
299 jasmine.Matchers.prototype.toThrow = function(expected) {
Supongo que probablemente deberías escribirlo así (usando lambda - función anónima):
expect(function() { parser.parse(raw); } ).toThrow("Parsing is not possible");
Esto se confirma en el siguiente ejemplo:
expect(function () {throw new Error("Parsing is not possible")}).toThrow("Parsing is not possible");
Douglas Crockford recomienda encarecidamente este enfoque, en lugar de utilizar "lanzar nuevo error()" (forma de creación de prototipos):
throw {
name: "Error",
message: "Parsing is not possible"
}
Como se mencionó anteriormente, se debe pasar una función toThrow
tal como es la función que estás describiendo en tu prueba: "Espero que esta función arroje x"
expect(() => parser.parse(raw))
.toThrow(new Error('Parsing is not possible'));
Si utiliza Jasmine-Matchers, también puede utilizar uno de los siguientes cuando se adapte a la situación;
// I just want to know that an error was
// thrown and nothing more about it
expect(() => parser.parse(raw))
.toThrowAnyError();
o
// I just want to know that an error of
// a given type was thrown and nothing more
expect(() => parser.parse(raw))
.toThrowErrorOfType(TypeError);