¿Cómo puedo escribir una prueba que espere que se produzca un 'Error' en Jasmine?

Resuelto echox asked hace 14 años • 12 respuestas

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.

echox avatar Nov 10 '10 19:11 echox
Aceptado

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(...),

Pete Hodgson avatar Nov 10 '2010 13:11 Pete Hodgson

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"
}
Andrzej Śliwa avatar Nov 10 '2010 13:11 Andrzej Śliwa

Como se mencionó anteriormente, se debe pasar una función toThrowtal 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);
Jamie Mason avatar Jan 24 '2017 08:01 Jamie Mason