2016-11-11 15 views
1

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') 
     ); 
    }); 
} 

答えて

0

私は間違ったことをからかいました。機能ではなく、この場合のデータあざけるする必要:

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

を私の要求が正しいと約束が戻っていなかったではなかったです。

関連する問題