处理Jasmine测试中的javascript错误

时间:2013-11-22 11:53:12

标签: javascript gruntjs jasmine

我正在开发一个javascript应用程序,它监听window.onerror()并向端点报告我和我的团队正在构建。我正在使用grunt-contrib-jasmine用于单元测试方面,并且遇到问题,因为我的测试用例期望抛出错误。

使用幻像运行测试用例时,会不必要地混淆我的输出:http://cl.ly/image/1n3k3z2g2V2l

在引用错误的实例中,我的测试如下所示:

it("should report reference errors", function() {
    spyOn(window.fred, 'sendRequest').andCallFake(function(details) {
        expect(details.type).toEqual('js-error');
        expect(details.message).toBeNonEmptyString();
    });
    runs(function() {
        var script = document.createElement('script');
        script.type = 'text/javascript';
        script.innerHTML = 'reference_error;';
        document.body.appendChild(script);
    });

    waits(2000);

    runs(function() {
        expect(window.fred.sendRequest).toHaveBeenCalled();
    });
});

我希望能够处理在代码中的某个点抛出的ReferenceError。我可以看到,这种情况间接发生在document.body.appendChild(script);。 Jasmine的expect(fn).toThrow(e)看起来如果我在这里使用它会起作用但是测试仍然失败。我也尝试用try { ... } catch (err) { ... }围绕它,但无济于事。

我的问题,有没有人对如何处理这个问题有任何建议?

1 个答案:

答案 0 :(得分:0)

通常情况下,jasmine会尝试捕获您的规范引发的任何异常,并将规范标记为失败。但是,因为浏览器在尝试解析脚本标记时抛出此异常,所以jasmine不在调用堆栈中。这就是toThrow不起作用的原因。

此外,只要您的onerror方法返回true,浏览器就应not do it's default error action,在这种情况下请登录到控制台。