单元测试window.onerror与茉莉花

时间:2012-05-04 16:53:28

标签: javascript error-handling jasmine

我是javascript的新手,我正在尝试使用jasmine对一些错误处理代码进行单元测试。

特别是,我正在尝试编写一些测试来验证我们调用替换window.onerror()的自定义代码(称为windowHandleError),并且正在执行我们想要的操作。

我尝试过以下方面:

       it("testing window.onerror", function() {
        spyOn(globalerror, 'windowHandleError');
        globalerror.install();

        var someFunction = function() {
            undefinedFunction();
        };
        expect(function() {someFunction();}).toThrow();
        expect(globalerror.windowHandleError).toHaveBeenCalled();
    });

但它不会触发错误。我看过一些相关的问题,但他们似乎询问了特定的浏览器,或者如何/在何处使用onerror而不是如何测试它。
window.onerror not firing in Firefox
Capturing JavaScript error in Selenium
window.onerror does not work
How to trigger script.onerror in Internet Explorer?

根据其中的一些说法,我认为在调试器中运行规范测试会强制触发错误,但没有骰子。有人知道更好的方法吗?

2 个答案:

答案 0 :(得分:3)

我最近开发了基于JavaScript error handler的小型Buster.JS小型The test that exercises the window.onerror,类似于Jasmine。

The same approach is available with Jasmine看起来像这样:

  "error within the system": function (done) {

    setTimeout(function() {
      // throw some real-life exception
      not_defined.not_defined();
    }, 10);

    setTimeout(function() {
      assert.isTrue($.post.called);
      done();
    }, 100);
  }

它会在setTimeout回调中抛出一个实际错误,它不会停止测试执行,并会在另一个setTimeout中检查是否在100ms之后调用了间谍,然后调用done()这就是你测试异步功能的方法Buster.JS。 {{3}}在异步测试中使用done()

答案 1 :(得分:0)

不了解Jasmine。

所有单元测试都在try / catch块内运行,这样如果一个测试死掉,下一个测试就可以运行(至少为True的QUnit)。并且由于window.onerror没有捕获已经在try / catch中捕获的异常,因此在单元测试中测试时不会运行它。

尝试根据异常手动调用onerror函数。

try {
    //Code that should fail here.
    someUndefinedFunction();
} catch (e) {
    window.onerror.call(window, e.toString(), document.location.toString(), 2);
}

expect(globalerror.windowHandleError).toHaveBeenCalled();

这远非完美,因为document.location与url参数不同,您需要手动设置行号。更好的方法是解析e.stack以获取正确的文件和行号。

在单元测试中调用这样的函数时,最好只测试一下你的函数是否已设置,以及在使用所有伪参数调用时它是否正常运行。