当运行利用域进行错误处理的测试时,即使库内的域处理程序应该捕获错误,Mocha 仍然会抛出错误。如果我在 Mocha 之外执行代码,它会正常运行,让我相信问题出在 Mocha 上。
Example:
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
脚本.js- 错误被域正确捕获并冒泡。
var foo = require("./foo.js");
foo(function() {
console.log("done");
});
result : done
正如你在上面看到的,如果我直接节点到script.js
它按预期运行,错误被域处理程序捕获并且代码继续。如果我在 Mocha 测试中运行相同的代码块,该错误会停止测试并给出失败。我相信这是因为错误是在 uncaughtException 处理程序或类似的处理程序上发送的。另一个复杂之处是,如果我在函数调用周围有一个 process.nextTick() ,那么它在 Mocha 中可以正常工作,这让我相信 Mocha 只能处理同步错误,但可以很好地处理异步错误。
这里有一些关于这个问题的讨论:https://groups.google.com/forum/#!msg/nodejs/n-W9BSfxCjI/SElI1DJ_6u0J and https://github.com/joyent/node/issues/4375 .
我感到困惑的是,所有这些讨论似乎都表明问题在几个月前就已经得到解决。任何人都知道该问题的简单解决方法,或者为什么我没有看到其他人似乎认为目前已经修复的错误得到修复。
我在 Windows 7 上的 CentOS 6.3 Vagrant VirtualBox 上运行节点 v0.10.18 和 Mocha 1.13.0。