如何使用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它也有效,所以我认为,在这种情况下治愈是回调。但这是非常脏的解决方案。如何在一次测试中更清楚地混合thenasync-awaitdone

答案

在函数体中使用await将测试函数转换为async函数。

async functions总是返回Promise

所以在这种情况下:

it('Sample test', async function(done) {
    await Promise.resolve(0);
    Promise.resolve(0).then(function() {
      return done();
    });
    return null;
});

...测试函数返回一个将解析为Promisenull


在你的另一个例子中,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的函数体内。

(请注意,这两个测试的表现非常不同)。


没有理由同时使用doneasync / 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 插入和检索对象的单元测试?

在 .net 4 上使用 async-await

如何使用 Mocha 在 Detox 中重试失败的端到端测试?

如何使用 Mocha 在控制器中存根模块方法