我是javascript的新手,我正在尝试使用jasmine对一些错误处理代码进行单元测试。
特别是,我正在尝试编写一些测试来验证我们调用替换window.onerror()的自定义代码(称为windowHandleError),并且正在执行我们想要的操作。
我尝试过以下方面:
it("testing window.onerror", function() {
spyOn(globalerror, 'windowHandleError');
globalerror.install();
var someFunction = function() {
undefinedFunction();
};
expect(function() {someFunction();}).toThrow();
expect(globalerror.windowHandleError).toHaveBeenCalled();
});
但它不会触发错误。我看过一些相关的问题,但他们似乎询问了特定的浏览器,或者如何/在何处使用onerror而不是如何测试它。
window.onerror not firing in Firefox
Capturing JavaScript error in Selenium
window.onerror does not work
How to trigger script.onerror in Internet Explorer?
根据其中的一些说法,我认为在调试器中运行规范测试会强制触发错误,但没有骰子。有人知道更好的方法吗?
答案 0 :(得分:3)
我最近开发了基于JavaScript error handler的小型Buster.JS小型The test that exercises the window.onerror,类似于Jasmine。
The same approach is available with Jasmine看起来像这样:
"error within the system": function (done) {
setTimeout(function() {
// throw some real-life exception
not_defined.not_defined();
}, 10);
setTimeout(function() {
assert.isTrue($.post.called);
done();
}, 100);
}
它会在setTimeout回调中抛出一个实际错误,它不会停止测试执行,并会在另一个setTimeout中检查是否在100ms之后调用了间谍,然后调用done()
这就是你测试异步功能的方法Buster.JS。 {{3}}在异步测试中使用done()
。
答案 1 :(得分:0)
不了解Jasmine。
所有单元测试都在try / catch块内运行,这样如果一个测试死掉,下一个测试就可以运行(至少为True的QUnit)。并且由于window.onerror没有捕获已经在try / catch中捕获的异常,因此在单元测试中测试时不会运行它。
尝试根据异常手动调用onerror函数。
try {
//Code that should fail here.
someUndefinedFunction();
} catch (e) {
window.onerror.call(window, e.toString(), document.location.toString(), 2);
}
expect(globalerror.windowHandleError).toHaveBeenCalled();
这远非完美,因为document.location与url参数不同,您需要手动设置行号。更好的方法是解析e.stack以获取正确的文件和行号。
在单元测试中调用这样的函数时,最好只测试一下你的函数是否已设置,以及在使用所有伪参数调用时它是否正常运行。