gpt4 book ai didi

javascript - 使用生成器函数进行 Mocha 测试中的静默错误

转载 作者:行者123 更新时间:2023-12-03 06:55:02 24 4
gpt4 key购买 nike

我想对一个函数进行单元测试。在该函数中,我将 Co 与生成器函数一起使用。当错误发生时,我捕获它,然后调用 cb 并返回错误

在我的单元测试中,我做了一个错误的断言,但 mocha 没有报告它,它只是超时了:

//function to test

function start(data, cb) {
co(function * coStart() {
yield Promise.reject('err'); // yield error for sake of demo
}).then(function(result){
return cb(null, result);
}).catch(function (err) {
// we get here
return cb(err);
});
}

// mocha test

it('fails on incorrect data', function(done){
MyModel.start({'foo': 'bar'}, function(err, res){
assert.equal(err, 'err2'); //this fails but mocha just stops here and times out
done();
});
});

显然我在这里做错了什么?

我知道你可以向 mocha 返回一个 promise 并在测试中省略完成回调,但我的函数“start”无法返回一个 promise ,它就像中间件,所以它应该与回调一起使用

最佳答案

您的代码执行与此类似的操作:

Promise.reject('err')
.catch(() => {
// throw another exception
throw 'foo';
});

也就是说:在 .catch() 子句中,抛出另一个异常(在您的情况下,是 assert.equal(err, 'err2') 抛出的异常),同步地,未处理(例如,通过另一个 .catch() 子句)。这将导致第二个异常被忽略(有关解释,请参阅 this answer),但它会阻止测试用例完成(永远不会到达 done() 行,因此测试超时案例)。

如果您确实需要回调支持,可以通过在 start() 中添加另一个 .catch() 子句或异步调用回调来解决此问题:

return setImmediate(function() { cb(null, result) });
...
return setImmediate(function() { cb(err) });
...

但理想情况下,您应该考虑完全删除回调支持并仅传递 promise 的可能性。 Mocha 支持开箱即用的 Promise,因此代码如下所示:

function start(data) {
return co(function * coStart() {
yield Promise.reject('err');
});
}

it('fails on incorrect data', function(){
return start({'foo': 'bar'}).then(function() {
throw new Error('should not be reached');
}, function(err) {
assert.equal(err, 'err2');
});
});

关于javascript - 使用生成器函数进行 Mocha 测试中的静默错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37316645/

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