我正在使用一些代码,其中我需要测试由函数抛出的异常的类型(它是TypeError, ReferenceError等?)
我目前的测试框架是AVA,我可以测试它作为第二个参数t.throws方法,就像这里:
it('should throw Error with message \'UNKNOWN ERROR\' when no params were passed', (t) => {
const error = t.throws(() => {
throwError();
}, TypeError);
t.is(error.message, 'UNKNOWN ERROR');
});
我开始用Jest重写我的测试,但不知道如何轻松地做到这一点。这可能吗?
您必须将期望的函数代码包装在另一个箭头函数中,否则错误将不会被捕获,断言将失败。
要测试的函数:
const testThrowingError = () => {
throw new Error();
};
测试:
describe("error function should Throw Error", () => {
expect(() =>testThrowingError()).toThrowError();
});
资源:
https://jestjs.io/docs/expect#tothrowerror
开玩笑地说,你必须将一个函数传递给expect(函数)。toThrow(<空白或错误类型>)。
例子:
test("Test description", () => {
const t = () => {
throw new TypeError();
};
expect(t).toThrow(TypeError);
});
或者如果你还想检查错误信息:
test("Test description", () => {
const t = () => {
throw new TypeError("UNKNOWN ERROR");
};
expect(t).toThrow(TypeError);
expect(t).toThrow("UNKNOWN ERROR");
});
如果需要测试现有函数是否抛出一组参数,则必须将其包装在expect()中的匿名函数中。
例子:
test("Test description", () => {
expect(() => {http.get(yourUrl, yourCallbackFn)}).toThrow(TypeError);
});
文档清楚地说明了如何做到这一点。假设我有一个函数,它有两个参数,如果其中一个为空,它就会抛出一个错误。
function concatStr(str1, str2) {
const isStr1 = str1 === null
const isStr2 = str2 === null
if(isStr1 || isStr2) {
throw "Parameters can't be null"
}
... // Continue your code
您的测试
describe("errors", () => {
it("should error if any is null", () => {
// Notice that the expect has a function that returns the function under test
expect(() => concatStr(null, "test")).toThrow()
})
})