我在测试时遇到了nodejs的测试,但收到未声明的完成函数错误。
Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
我的测试代码是,我已经完成了回调,但是仍然收到错误消息,无法调用 done();
done();
it('remove existing subdocument', (done) => { const Vic = new User({ name: 'Vic', posts: [{ title: 'Leaning Nodejs' }] }); vic.save() .then(() => User.findOne({ name: 'Vic' })) .then((user) => { const post = user.posts[0]; post.remove(); return user.save(); }) .then(() => User.findOne({ name: 'Vic' })) .then((user) => { assert(user.posts.length === 0); done(); }); });
我遇到了同样的问题,@ MFAL的评论链接提供了帮助。我正在扩展它。
当存在错误/不正确的断言时,promise中会引发错误。这导致承诺被拒绝。一旦拒绝完成,就永远不会调用,并且摩卡报告超时。我通过编写一个.catch块并将其与promise链接来解决了这个问题:
.catch
it('resolves', (done) => { fooAsyncPromise(arg1, arg2).then((res, body) => { expect(res.statusCode).equal(incorrectValue); done(); }).catch(done); });
Wietse博客中提到的其他方式是:
链接一个then(done, done)既处理承诺又解决承诺的a。
then(done, done)
it('resolves', (done) => { resolvingPromise.then( (result) => { expect(result).to.equal('promise resolved'); }).then(done, done); });
兑现承诺:
it('resolves', () => { return resolvingPromise.then( (result) => { expect(result).to.equal('promise resolved'); }); });
使用异步/等待:
it('assertion success', async () => { const result = await resolvingPromise; expect(result).to.equal('promise resolved'); });