一尘不染

对于异步测试和挂钩,请确保调用了“ done()”。如果返回承诺,请确保其解决

node.js

我在测试时遇到了nodejs的测试,但收到未声明的完成函数错误。

Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

我的测试代码是,我已经完成了回调,但是仍然收到错误消息,无法调用 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();
      });
  });

阅读 289

收藏
2020-07-07

共1个答案

一尘不染

我遇到了同样的问题,@ MFAL的评论链接提供了帮助。我正在扩展它。

当存在错误/不正确的断言时,promise中会引发错误。这导致承诺被拒绝。一旦拒绝完成,就永远不会调用,并且摩卡报告超时。我通过编写一个.catch块并将其与promise链接来解决了这个问题:

          it('resolves', (done) => {
            fooAsyncPromise(arg1, arg2).then((res, body) => {
                expect(res.statusCode).equal(incorrectValue);
                done();
            }).catch(done);
         });

Wietse博客中提到的其他方式是:

链接一个then(done, done)既处理承诺又解决承诺的a。

         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'); 
        });
2020-07-07