测试基于异步/承诺的混合代码和基于回调的代码

时间:2018-10-28 07:34:43

标签: mocha

此代码:

it('should not say overspecified', async function (done) {
    await new Promise(resolve => resolve());
    done();
});

原因:Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.

但是...我没有退还承诺。我只是在等待诺言。

如果我将代码更改为此,它将起作用:

it('should not say overspecified',function(){
  return new Promise(async resolve=>{
    await (new Promise(resolve=>resolve()));
    resolve();
  })
});

为什么只有当我不必要地将代码包装在Promise中时,它才起作用?

1 个答案:

答案 0 :(得分:2)

  

此代码:

it('should not say overspecified', async function (done) {
    await new Promise(resolve => resolve());
    done();
});
  

原因:错误:解决方法指定过多。指定回调或返回Promise;不是两者

由于设计原因,async functions总是return a Promise

在Mocha中,您可以返回Promise 使用done,但可以返回 not both

我会这样:

// Do not pass `done` as a parameter to `it` callback.
it('should not say over specified', function() {
  return new Promise(resolve => resolve())
});

或者如果您想使用await

// Do not pass `done` as a parameter to `it` callback.
it('should not say overspecified', async function () {
  await new Promise(resolve => resolve());
});

这是一个实用的async/await示例:

require('chai').should()

const getFoo = async () => 'foo'

describe('#getFoo()', () =>  {
  it('returns foo', async () => {
    const foo = await getFoo()
    foo.should.equal('foo')
  })
})

您仅应将done用于基于回调或基于事件的代码。

完全不需要将其与基于Promise的代码(例如常规Promises或async/await)一起使用。

测试基于Promise和回调的混合代码:

如果我可以控制正在测试的代码(我编写了代码),那么我“ promisify”是我从外部回调样式API中使用的所有基于回调的代码,因此该代码的整个异步API我正在使用始终使用Promises。如果合理使用,那么显然也使测试更加容易(完全消除了完成工作的需要)。