I reemplace Jasmine's toThrow matcher con lo siguiente, que le permite coincidir con la propiedad de nombre de la excepción o su propiedad de mensaje. Para mí esto hace que las pruebas más fáciles de escribir y menos frágil, ya que puedo hacer lo siguiente:
throw {
name: "NoActionProvided",
message: "Please specify an 'action' property when configuring the action map."
}
y luego probar con lo siguiente:
expect (function() {
.. do something
}).toThrow ("NoActionProvided");
Esto me permite modificar el mensaje de excepción más adelante sin romper pruebas, cuando lo importante es que lanzó el tipo esperado de excepción.
Esto es el equivalente 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;
};
para pasar argumentos a la función que se está probando, sin necesidad de utilizar una función anónima, tratan 'Function.bind': http://stackoverflow.com/ a/13233194/294855 –