用 QUnit/Sinon 测试 window.onerror
Testing window.onerror with QUnit/Sinon
我最近在我的代码库中实现了一个自定义的全局错误处理程序,我想在我的 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
});
由于 banana()
调用引起的 ReferenceError
实际上被 QUnit 本身捕获,这导致测试执行失败。
有没有办法告诉 QUnit 我想自己处理错误,或者手动抛出错误以便调用我自己的 window.onerror
而不是 QUnit 的?
如您所见,问题在于 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.
});
我最近在我的代码库中实现了一个自定义的全局错误处理程序,我想在我的 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
});
由于 banana()
调用引起的 ReferenceError
实际上被 QUnit 本身捕获,这导致测试执行失败。
有没有办法告诉 QUnit 我想自己处理错误,或者手动抛出错误以便调用我自己的 window.onerror
而不是 QUnit 的?
如您所见,问题在于 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.
});