簡體   English   中英

由於未解決的承諾,Jest中的異步測試失敗

[英]Async test in Jest failing due to unresolved promise

我正在學習Jest並遇到一個問題,試圖模擬一個返回fetch承諾的異步函數。

在他們的文檔中,有這樣的:“如果一個promise根本沒有解決,可能會拋出此錯誤: - 錯誤:超時 - 在jasmine.DEFAULT_TIMEOUT_INTERVAL.指定的超時內沒有調用異步回調jasmine.DEFAULT_TIMEOUT_INTERVAL.最常見的是這是由沖突的Promise實現。考慮用您自己的實現替換全局promise實現,例如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')
        );
    });
}

我在嘲笑錯誤的事情。 需要模擬函數,而不是這種情況下的數據:

jest.mock('../parseMultiPart');
jest.mock('../request');

我的要求不正確,承諾永遠不會回來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM