web-dev-qa-db-ja.com

非同期テストとフックの場合、「done()」が呼び出されることを確認してください。 Promiseを返す場合、解決することを確認します

テスト中に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();
      });
  });
_
23
Gerald Brigen

私は同じ問題に直面していた、@ MFALのコメントへのリンクが助けになった。私はそれを拡大しています。

エラー/不正なアサーションがある場合、promise内でエラーが発生します。これは約束拒否につながります。拒否されると、doneは呼び出されず、mochaレポートはタイムアウトします。 _.catch_ブロックを記述し、promiseでチェーンすることでこれを解決しました。

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

Wietseのブログ で言及されている他の方法は次のとおりです。

約束の解決と拒否の両方を処理する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');
          });
        });
_

Async/waitを使用します。

_        it('assertion success', async () => {
          const result = await resolvingPromise;
          expect(result).to.equal('promise resolved'); 
        });
_
21
avck

Mochaのデフォルトのタイムアウトを2秒から10秒に増やすだけで、い方法を知っていますテストスクリプトにフラグ--timeout 10000を追加することによって行われます。つまり-

package.json

 "scripts": {
    "start": "SET NODE_ENV=dev && node server.js",
    "test": "mocha --timeout 10000"
  }

package.jsonファイルでは、以下で使用するように--timeout 1500を使用してこのエラーを修正できます。

"scripts": {
  "start": "node server/server.js",
  "test": "export NODE_ENV=test || SET \"NODE_ENV=test\" && mocha --timeout 15000 server/**/*.test.js",
  "test-watch": "nodemon --exec 'npm test'"
   }

このエラーはmochaが原因で発生します。

2
Sandeep chand

特定のテストにタイムアウトを追加して、デフォルトのタイムアウトである2秒を増やしたり、上書きしたりできます。私は同じ問題を抱えていましたが、次を使用してそれを渡すことができました:

it('Test', (done) => { 
//your code  
done();
}).timeout(10000);

アイデアは、タイムアウトを増やすことです。
別の方法は、必要な方法でのみ行うことです。

 it('remove existing subdocument', function(done) {
         this.timeout(10000);
      //your code is here
      done();
    });

それは私が問題を解決するのに役立ちます。

0
Mr.B