我正在尝试为Jasmine测试框架编写一个测试,该测试预计会出现错误。目前,我正在使用来自GitHub的Jasmine Node.js集成。
在我的Node.js模块中,我有以下代码:
throw new Error("Parsing is not possible");
现在我试着写一个测试,期望这个错误:
describe('my suite...', function() {
[..]
it('should not parse foo', function() {
[..]
expect(parser.parse(raw)).toThrow(new Error("Parsing is not possible"));
});
});
我还尝试了Error()和其他一些变体,只是不知道如何使它工作。
如前所述,需要将函数传递给toThrow,因为它是您在测试中描述的函数:“I expect this function to throw x”
expect(() => parser.parse(raw))
.toThrow(new Error('Parsing is not possible'));
如果使用茉莉花-匹配器,你也可以使用以下其中之一,当他们适合的情况;
// I just want to know that an error was
// thrown and nothing more about it
expect(() => parser.parse(raw))
.toThrowAnyError();
or
// I just want to know that an error of
// a given type was thrown and nothing more
expect(() => parser.parse(raw))
.toThrowErrorOfType(TypeError);
您正在使用:
expect(fn).toThrow(e)
但是如果你看一下函数注释(expected is string):
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) {
我想你应该这样写(使用lambda - anonymous函数):
expect(function() { parser.parse(raw); } ).toThrow("Parsing is not possible");
下面的例子证实了这一点:
expect(function () {throw new Error("Parsing is not possible")}).toThrow("Parsing is not possible");
Douglas Crockford强烈推荐这种方法,而不是使用“throw new Error()”(原型):
throw {
name: "Error",
message: "Parsing is not possible"
}
我用下面的代码替换了Jasmine的toThrow匹配器,它允许您匹配异常的name属性或其message属性。对我来说,这使得测试更容易编写,也不那么脆弱,因为我可以做到以下几点:
throw {
name: "NoActionProvided",
message: "Please specify an 'action' property when configuring the action map."
}
然后用下面的方法进行测试:
expect (function () {
.. do something
}).toThrow ("NoActionProvided");
这让我可以稍后在不中断测试的情况下调整异常消息,而重要的是它抛出了预期的异常类型。
这是toThrow的替代物,允许这样做:
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;
};