テスト中に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();
});
});
_
私は同じ問題に直面していた、@ 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');
});
_
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秒を増やしたり、上書きしたりできます。私は同じ問題を抱えていましたが、次を使用してそれを渡すことができました:
it('Test', (done) => {
//your code
done();
}).timeout(10000);
アイデアは、タイムアウトを増やすことです。
別の方法は、必要な方法でのみ行うことです。
it('remove existing subdocument', function(done) {
this.timeout(10000);
//your code is here
done();
});
それは私が問題を解決するのに役立ちます。