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