node.js - 在 mocha 中测试 nodeJS 时域未正确捕获错误

标签 node.js mocha.js node.js-domains

当运行使用域进行错误处理的测试时,Mocha 似乎仍然会抛出错误,即使库中的域处理程序应该已经捕获了错误。如果我在 Mocha 之外执行代码,它会正常运行,这让我相信问题出在 Mocha 上。

例子:

foo.js

module.exports = function(done) {
    var domain = require("domain");
    var d = domain.create();

    d.on("error", function() {
        done();
    });

    d.run(function() {
        throw new Error("foo");
    });
}

test.js - foo.js 中抛出的错误未被域捕获。

describe("test", function() {
    it("should succeed", function(done) {
        var foo = require("./foo.js");
        foo(function() {
            console.log("done");
            done();
        });
    });
});

result : error thrown

script.js - 错误被域正确捕获并冒泡。

var foo = require("./foo.js");
foo(function() {
    console.log("done");
});
result : done

正如您在上面看到的,如果我直接指向 script.js,它会按预期运行,错误会被域处理程序捕获并且代码会继续。如果我在 Mocha 测试中运行相同的代码块,错误会停止测试并给出失败。我相信这是因为错误是在 uncaughtException 处理程序或类似的东西上发送的。另一个复杂的问题是它在 Mocha 中正常工作,如果我在函数调用周围有一个 process.nextTick() ,这让我相信 Mocha 只能处理同步错误,但可以很好地处理异步错误。

这里有一些关于这个问题的讨论:https://groups.google.com/forum/#!msg/nodejs/n-W9BSfxCjI/SElI1DJ_6u0Jhttps://github.com/joyent/node/issues/4375 .

我感到困惑的是,所有这些讨论似乎都表明问题在几个月前就已经解决了。任何人都知道该问题的简单解决方法,或者为什么我没有看到其他人似乎认为此时已修复的错误已修复。

我在 Windows 7 上的 CentOS 6.3 Vagrant VirtualBox 上运行 Node v0.10.18 和 Mocha 1.13.0。

最佳答案

发现问题。 NodeJS 域捕获同步错误,但事件继续冒泡到 try/catch。如果您将 domain.run() 包装在 try/catch 中,那么将执行域错误处理程序和 catch。

因此,最好的做法似乎是在所有 domain.run() 中使用 process.nextTick。这显示在文档示例中,但没有像我希望的那样明确表达。

例子:

d.run(function() {
    process.nextTick(function() {
        // do stuff
    });
});

在这种情况下,缺陷不在 Mocha 中。

证明 NodeJS 域未捕获 try/catch 中的同步错误:https://gist.github.com/owenallenaz/7141699

关于node.js - 在 mocha 中测试 nodeJS 时域未正确捕获错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19461234/

相关文章:

Node.js console.log() 没有记录任何东西

node.js - 带有 Typescript 的 NodeJS 的 REST 客户端

javascript - 如何测试函数在一段时间后是否发出事件?

node.js - ExpressJS : How to mock request handler next function with mocha

javascript - 访问全局变量 JavaScript 单元测试

javascript - Node.js 服务器崩溃处理

javascript - 是否需要处理 node.js 域?应该什么时候做?

node.js - 如何在应用程序或功能模块加载时显式执行某些代码?

javascript - 在 Node.js 中复制 Java 密码哈希代码 (PBKDF2WithHmacSHA1)

javascript - Node 、Express、域、未捕获的异常 - 仍然丢失