2016-11-11 73 views
1

我正在學習Jest並運行到試圖模擬異步函數的問題,該異步函數返回fetch的承諾。由於未解決的承諾導致Jest失敗的異步測試

在他們的文檔,還有這個: 「如果一個承諾不能解決所有,可能會拋出這個錯誤: - 錯誤:超時 - 異步回調不被jasmine.DEFAULT_TIMEOUT_INTERVAL. 最常見的是這個規定的超時時間內調用是由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') 
     ); 
    }); 
} 

回答

0

我在嘲笑錯誤的事情。需要被嘲諷的功能,而不是數據在這種情況下:

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

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