如何使用async-await然后在一个Mocha测试中完成?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用async-await然后在一个Mocha测试中完成?相关的知识,希望对你有一定的参考价值。
所以,我有这样的测试:
it 'sample test', (done)->
await Promise.resolve 0
Promise.resolve 0
.then ->
done()
null
请注意,null
最终是为了避免返回Promise。然而,测试属于经典的"Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both"
我查了结果JS代码,没什么奇怪的:
it('Sample test', async function(done) {
await Promise.resolve(0);
Promise.resolve(0).then(function() {
return done();
});
return null;
});
我不明白,有什么不对,因为(我认为)这段代码不应该返回承诺。此外,当我把第一个承诺(与await
)包装到setTimeout
时,它工作正常。
it 'working test', (done)->
setTimeout ->
await Promise.resolve 0
, 0
Promise.resolve 0
.then ->
done()
null
当然,使用setImmediate
而不是setTimeout
它也有效,所以我认为,在这种情况下治愈是回调。但这是非常脏的解决方案。如何在一次测试中更清楚地混合then
,async-await
和done
?
在函数体中使用await
将测试函数转换为async
函数。
async
functions总是返回Promise
。
所以在这种情况下:
it('Sample test', async function(done) {
await Promise.resolve(0);
Promise.resolve(0).then(function() {
return done();
});
return null;
});
...测试函数返回一个将解析为Promise
的null
。
在你的另一个例子中,Mocha没有抱怨,因为代码编译成这样:
it('working test', function(done) {
setTimeout(async function() {
return (await Promise.resolve(0));
}, 0);
Promise.resolve(0).then(function() {
return done();
});
return null;
});
...因为await
现在在传递给setTimeout
的函数体内。
(请注意,这两个测试的表现非常不同)。
没有理由同时使用done
和async / await
测试函数(或返回Promise
的函数),因此Mocha未通过该错误进行测试。
您的第一个测试可以简化为:
it 'sample test', ()->
await Promise.resolve 0
await Promise.resolve 0
...或者如果你需要在一个then
工作链接到第二个Promise
你可以这样做:
it 'sample test', ()->
await Promise.resolve 0
await Promise.resolve 0
.then ->
// do stuff here
在Mocha v3.0.0和更新版本中,返回Promise并调用done()
将导致异常,因为这通常是一个错误 - docs
自从async function
always return Promise
你得到这个错误。可能的解决方案:
- 删除
async function
it('Sample test', function(done) { Promise.resolve(0) .then(function() { ... }) .then(function() { ... // if necessary }) .then(function() { done(); }); });
- 返回
Promise
it('Sample test', function() { return Promise.resolve(0) .then(function() { ... }) .then(function() { ... // if necessary }); });
- 使用
async/await
it('Sample test', async function() { await Promise.resolve(0); await Promise.resolve(0); });
以上是关于如何使用async-await然后在一个Mocha测试中完成?的主要内容,如果未能解决你的问题,请参考以下文章
如何在for-each循环中使用async-await? [重复]
Async-Await:即使一个错误,如何在多个等待调用中获取数据?
如何使用 mongoose、mocha 和 chai 编写用于向 mongodb 插入和检索对象的单元测试?