使用QUnit / Sinon测试window.onerror

时间:2016-09-29 09:46:59

标签: javascript unit-testing qunit

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

1 个答案:

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