我正在修改 node.js 库以支持真正的异步操作。
我在使用 Mocha 和 Chai 时遇到了麻烦,无法通过这个(类似的)测试。
it('should throw an error', function() {
expect(function() {
process.nextTick(function() {
throw new Error('This is my error');
});
}).to.throw(Error);
});
问题是 - 由于 nextTick - 错误被抛出 it
的范围,除了测试失败之外,Mocha 还输出以下内容。
Uncaught Error: This is my error
为了使其成功,构建此测试的正确方法是什么?
最佳答案
嗯...在一个成熟的应用程序中我会做的可能是使用类似 Sinon 的东西检查应该抛出错误的方法是否已被调用并且正在抛出。
在您不能这样做的代码中,以下方法将捕获异常:
var expect = require("chai").expect;
var domain = require("domain");
it('should throw an error', function(done) {
var d = domain.create();
d.on('error', function (err) {
// Exit the current domain.
d.exit();
// We must execute this code at the next tick.
process.nextTick(function () {
console.log(err); // Just to show something on the console.
expect(err instanceof Error).to.be.true;
done();
});
});
d.run(function () {
process.nextTick(function() {
throw new Error('This is my error');
});
});
});
此代码创建一个 "domain"存储在 d
中。域将在其中发生未捕获的异常时发出 error
事件,因此我们在我们创建的域 (d.run(...)
) 中运行测试并等待异常发生 (d.on('error', ...
)。我们检查它是否是一个 Error
对象。(在实际测试中,我还会检查错误消息。)完成后,我们调用 done()
告诉 Mocha 异步测试结束。
error
事件的处理程序调用 d.exit()
。这是为了让 Mocha 在断言 (expect(err instanceof Error)
...) 结果失败时可以正常捕获错误。如果我们不退出域,那么域将捕获错误。此外,检查本身必须在下一个价格变动时执行,以便在 d
域之外。
使用 domain
有问题吗?
不!
domain
的文档附带了一些关于在运行正在进行的进程(如服务器)时捕获到未捕获的异常后关闭操作的警告。那么要做的就是清理能清理的,尽快退出。 但是,在测试中使用domain
与Mocha 已经在做的没有区别。Mocha 在异步代码中捕获未处理异常的方式是使用process.on('uncaughtException'
。 .捕获未处理的异常后,Mocha marks当前测试失败并继续。然而 documentation关于 uncaughtException
说“不要使用它,使用 domains
。如果您确实使用它,请在每次未处理的异常后重新启动您的应用程序!”
因此,任何对使用 domain
有疑问的人都不应该首先使用 Mocha。
关于javascript - 使用 Mocha 和 Chai 捕获超出范围的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26719186/