当运行使用域进行错误处理的测试时,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_6u0J和 https://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/