gpt4 book ai didi

javascript - Mocha 如何知道异步测试中的测试失败?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:32:10 25 4
gpt4 key购买 nike

我正在尝试了解 Mocha 的异步代码(位于 http://mochajs.org/#getting-started)是如何工作的。

describe('User', function() {
describe('#save()', function() {
it('should save without error', function(done) {
var user = new User('Luna');
user.save(function(err) {
if (err) throw err;
done();
});
});
});
});

我想知道 Mocha 如何在幕后决定测试是成功还是失败。

从上面的代码可以看出,user.save()是异步的,会立即返回。所以Mocha不会在执行it()后判断测试是成功还是失败。当 user.save() 最终成功调用 done() 时,Mocha 就会认为这是一个成功的测试。

我无法理解 Mocha 是如何知道上述案例中的测试失败的。例如,user.save() 使用 err 参数集调用其回调,然后回调抛出错误。在这种情况下,没有调用 Mocha 的任何函数。那么Mocha怎么知道回调发生了错误呢?

最佳答案

Mocha 能够检测到阻止调用回调或返回 promise 的故障,因为它使用 process.on('uncaughtException', ...); 来检测未捕获的异常。由于它连续运行所有测试,因此它始终知道未捕获的异常属于哪个测试。 (有时人们对此感到困惑:告诉 Mocha 测试是异步的并不意味着 Mocha 会与其他测试并行运行它。它只是告诉 Mocha 它应该等待回调或 promise 。)

除非有什么东西介入吞噬异常,否则Mocha就会知道测试失败,一旦检测到就会报错。这是一个例子。由于抛出一般异常,第一个测试失败。由于 expect 检查失败,第二个失败。它还会引发未处理的异常。

var chai = require("chai");
var expect = chai.expect;

it("failing test", function (done) {
setTimeout(function () {
throw new Error("pow!");
done();
}, 1000);
});

it("failing expect", function (done) {
setTimeout(function () {
expect(1).to.equal(2);
done();
}, 1000);
});

这是我控制台上的输出:

  1) failing test
2) failing expect

0 passing (2s)
2 failing

1) failing test:
Uncaught Error: pow!
at null._onTimeout (test.js:6:15)

2) failing expect:

Uncaught AssertionError: expected 1 to equal 2
+ expected - actual

-1
+2

at null._onTimeout (test.js:13:22)

堆栈跟踪指向正确的代码行。如果异常发生得更深,堆栈会更满。

当 Mocha 无法准确报告错误原因时,通常是因为中间代码吞没了引发的异常。或者当您使用 promises 时,问题可能是有人忘记调用方法这表明 promise 是否应该被完全处理并且是否应该抛出未处理的异常。 (你如何做到这一点取决于你使用的 promise 实现。)

关于javascript - Mocha 如何知道异步测试中的测试失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33398489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com