在mocha中测试nodeJS时,域没有正确捕获错误

Nuc*_*eon 4 mocha.js node.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");
    });
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

var foo = require("./foo.js");
foo(function() {
    console.log("done");
});
result : done
Run Code Online (Sandbox Code Playgroud)

正如您在上面所看到的,如果我直接将节点定向到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上运行节点v0.10.18和Mocha 1.13.0.

Nuc*_*eon 12

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

因此,似乎最好的做法是在所有内部使用process.nextTick domain.run().这在文档示例中显示,但未按我的意愿明确表达.

例:

d.run(function() {
    process.nextTick(function() {
        // do stuff
    });
});
Run Code Online (Sandbox Code Playgroud)

在这种情况下,缺陷不在摩卡.

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