Tôi thay thế trình so khớp toThrow của Jasmine bằng cách sau, cho phép bạn khớp với thuộc tính tên của ngoại lệ hoặc thuộc tính thông báo của nó. Đối với tôi điều này làm cho các bài kiểm tra dễ viết hơn và ít giòn hơn, vì tôi có thể làm như sau:
throw {
name: "NoActionProvided",
message: "Please specify an 'action' property when configuring the action map."
}
và sau đó kiểm tra với những điều sau đây:
expect (function () {
.. do something
}).toThrow ("NoActionProvided");
Điều này cho phép tôi điều chỉnh thông báo ngoại lệ sau đó mà không phá vỡ các bài kiểm tra, khi điều quan trọng là nó đã ném loại ngoại lệ dự kiến.
Đây là sự thay thế cho toThrow cho phép điều này:
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