用 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.
});