javascript - 使用 Mocha 和 Chai 捕获超出范围的错误

标签 javascript node.js mocha.js chai

我正在修改 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/

相关文章:

Node.js:如何在同一台服务器上运行多个不同的应用程序并优化 CPU 使用率?

javascript - res.should.have.status 给我错误

javascript - 如何在 Mocha 测试中检索当前测试的名称?

javascript - 在 mocha 中断言函数失败 "assert"导致超时而不是失败

javascript - `throw new Error` 和 `throw someObject` 有什么区别?

javascript - 如果网页上任何位置显示井号,则显示某些内容

javascript - Node 路由

node.js - 使用带有调色板颜色的 ffmpeg 将 GIF 转换为 MP4

javascript - Math.Random() 选择随机数组

javascript - 使用 parseString() 时, Node xml2js 返回 'undefined'