2017-05-24 5 views
2

私はこのnodejのテストをテストするとき、私は宣言されていないdone関数のエラーを受け取ります。非同期テストとフックの場合、 "done()"が呼び出されていることを確認してください。プロミスを返す場合、それが解決することを確認してください

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

コメントでMFALのリンクが助けた@私のテストコードは、私が行ってコールバックが、それでも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(); 
     }); 
    }); 
+2

この記事をチェックしてください。https://wietse.loves.engineering/testing-promises-with-mochaを-90df8b7d2e35 – MFAL

答えて

1

を呼び出すためにエラーになってきた私は、同じ問題に直面していましたさ。私はそれを拡大しています。

エラーがあるか間違ったアサーションがあると、約束の中でエラーが発生します。これにより、約束の拒否が導かれる。一度拒否されると、決して呼び出されず、モカはタイムアウトを報告します。 私は.catchブロックを書き込み、約束とそれを連鎖することにより、これを解決:Wietse's blogで述べたように

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

他の方法は、以下のとおりです。

チェーンに解決すると約束を拒否両方のハンドル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'); 
     });