Jestを勉強していて、fetch
という約束を返す非同期関数を模擬しようとすると問題に遭遇しています。約束は全く解決しない場合」、このエラーがスローされることがあり :彼らのドキュメントで未確認の約束のためにJestの非同期テストが失敗する
が、このあり - エラー:タイムアウト - 非同期コールバックは、最も一般的に、このjasmine.DEFAULT_TIMEOUT_INTERVAL.
によって指定されたタイムアウト内で呼び出されていませんでしたglobal.Promise = require.requireActual('promise');
のようなグローバルな約束の実装を置き換えたり、使用されているPromiseライブラリを単一のものに統合したりすることを検討してください。
これは問題の可能性がありますが、問題を解決したり、Promise
がどこに侵入しているかを判断する方法がわかりません。
おそらく、私のJestのモックの理解は間違っていますか?彼らの例を使ってみましたが、それはもちろん完璧に機能しました。 (https://facebook.github.io/jest/docs/tutorial-async.html#content)
これは、私は、コンソールで得るものです:ここでは
● endpoint can receive form data › can parse and fulfill a promise
Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
私のモジュールとテストです:
// myModule/index.js
import { OK } from 'http-status-codes';
import request from './request';
import parseForm from '../../../../modules/parseMultiPart';
export default (req, res, next) => parseForm(req)
.then(body => request(body, req)
.then(result => result.text())
.then(result => res.status(OK).send(result)))
.catch(next);
// myModule/request.js
import fetch from 'node-fetch';
export default (body, req) => fetch('http://url', {
method: 'POST',
body: JSON.stringify(body.fields),
headers: {
'Content-Type': 'application/json',
'X-Request-Id': req.id
}
});
// myModule/__tests__/myModule.test.js
import MockReq from 'mock-req';
import MockRes from 'mock-res';
import myModule from '../';
jest.mock('../request');
describe('endpoint can receive form data',() => {
const response = new MockRes();
const request = new MockReq({
method: 'POST',
url: '/webhook',
headers: {
'Content-Disposition': 'form-data; name="file"; filename="plain.txt"',
'Content-Type': 'multipart/form-data; custom=stuff; boundary=----TLV0SrKD4z1TRxRhAPUvZ',
'Content-Length': 213
}
});
it('can parse and fulfill a promise',() => myModule(request, response)
.then(text => expect(text).toEqual('API Event Received'))
);
});
// myModule/__mocks__/request.js
export default function request() {
return new Promise((resolve) => {
process.nextTick(
() => resolve('API Event Received')
);
});
}