【问题标题】:Testing window.onerror with QUnit/Sinon使用 QUnit/Sinon 测试 window.onerror
【发布时间】:2016-09-29 09:46:58
【问题描述】:

我最近在我的代码库中实现了一个自定义全局错误处理程序,我想在我的 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?

【问题讨论】:

    标签: javascript unit-testing qunit


    【解决方案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.
    });
    

    【讨论】:

    • 那是有道理的,因为在触发错误时测试 window.onerror 是没有意义的(这应该由设计保证),而实际上要测试的是myOnError 在做什么......谢谢!
    猜你喜欢
    • 2021-01-07
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 2016-06-18
    • 1970-01-01
    • 2011-05-27
    • 2015-08-05
    相关资源
    最近更新 更多