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:
throw {
name: "NoActionProvided",
message: "Please specify an 'action' property when configuring the action map."
}
y luego prueba con lo siguiente:
expect (function () {
.. do something
}).toThrow ("NoActionProvided");
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:
jasmine.Matchers.prototype.toThrow = function(expected) {
var result = false;
var exception;
if (typeof this.actual != 'function') {
throw new Error('Actual is not a function');
}
try {
this.actual();
} catch (e) {
exception = e;
}
if (exception) {
result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected) || this.env.equals_(exception.name, expected));
}
var not = this.isNot ? "not " : "";
this.message = function() {
if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) {
return ["Expected function " + not + "to throw", expected ? expected.name || expected.message || expected : " an exception", ", but it threw", exception.name || exception.message || exception].join(' ');
} else {
return "Expected function to throw an exception.";
}
};
return result;
};
Function.bind
: stackoverflow.com/a/13233194/294855