我最近在我的代码库中实现了一个自定义全局错误处理程序,我想在我的QUnit + Sinon套件中测试它的行为;但是,这似乎不起作用:
QUnit.test("It should fire an ajax request on errors", function(assert) {
var done = assert.async();
var myOnerror = window.onerror;
window.onerror = function(msg, url, line, col, error) {
myOnerror(msg, url, line, col, error);
//Some assertions on myOnerror execution
done();
};
banana(); //Trigger an error to have window.onerror execute
});
由于ReferenceError
调用引起的banana()
实际上是由QUnit本身捕获的,因此会在失败时停止测试执行。
有没有办法告诉QUnit我想自己处理错误,或者手动抛出错误,以便调用我自己的window.onerror
而不是QUnit?
答案 0 :(得分:1)
正如您所注意到的,问题是QUnit捕获错误。您希望这种情况发生,以便在您的某个测试确实发生意外错误时,您的测试运行不会爆炸。这里的诀窍是你不想测试错误被抛出。相反,您希望测试实际上有一个onerror
处理程序,并且它可以正常工作。
要测试错误处理程序是否正常工作,不必抛出错误!这可能看起来很奇怪,但你不是。相反,您可以使用假参数在测试中简单地调用错误处理函数。
QUnit.test("It should fire an ajax request on errors", function(assert) {
// Note that Error throwing is NOT async, so you shouldn't need this.
// var done = assert.async();
assert.strictEqual( window.onerror, myOnerror );
myOnerror(
"some test message",
"src/js/ajax-stuff.js",
13,
29,
new ReferenceError("some test message")
);
// write assertions here for what `MyOnerror` should have done.
});