ちょっと、そこ ! Promisesを使用して、JestでReduxアクションをテストしようとしています。
私のアクション関数は次のとおりです。
export function exportCurrentConfig() {
return function(dispatch, getState) {
const result = postJSON( some_url_im_requesting, {})
.then(data => {
return (dispatch) => {
dispatch({
type: 'GET_EXPORT_ID',
payload: data
})
}
})
return result
}
}
このpostJSON
関数はモックされています:
// __mocks__/fetch.js
export function postJSON (url, data) {
return new Promise((resolve, reject) => {
process.nextTick(
() => {}
)
})
}
そして、私のスペックでは、すべての約束が解決されたときに最終結果をチェックしようとしています:
// __tests__/components/exports-actions-test.js
jest.unmock('../')
jest.unmock('../actions')
jest.unmock('redux-mock-store')
jest.unmock('redux-thunk')
import * as actions from '../actions'
import configureMockStore from 'redux-mock-store'
import thunk from 'redux-thunk'
const middlewares = [thunk]
const mockStore = configureMockStore(middlewares)
describe('Dataset actions', () => {
it('exportCurrentConfig - default parameters', () => {
const expectedActions = [{
type: actions.GET_EXPORT_ID
}]
const store = mockStore({})
return store
.dispatch(actions.exportCurrentConfig({}))
.then(() => {
expect(store.getActions()).toEqual(expectedActions)
})
})
})
モック関数が呼び出されてpromiseが返され、アクションが何かを返しますが、仕様でこのエラーが発生します:
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
(babel-jest14.1.0およびjest-cli12.0.2を使用)
編集:また、Promiseのグローバル定義を再定義しようとしましたが、これも仕様を破っています。
ご協力いただきありがとうございます !
問題が発生しました。モック関数のpromiseを解決する必要があります。
// __mocks__/fetch.js
export function postJSON (url, data) {
return new Promise((resolve, reject) => {
process.nextTick(
() => resolve({})
)
})
}
将来このページを見つける可能性のある人々のためのこのエラーメッセージの理由を説明するこのコメントをここに追加します。
これは、promise内にディスパッチ関数がネストされているために発生します。
dispatch({
type: 'GET_EXPORT_ID',
payload: data
})
dispatch()は非同期であり、解決する必要があることに注意してください。 そのため、エラーメッセージが表示されていました。
done()
呼び出しを利用してこのエラーを解決したという点で、私はチャイムを鳴らしているところです。
私はreduxアクションをテストしていましたが、使用していたconsole.log
から、すべての出力が期待され、 resolve()
とdispatch()
が成功コールバック内で呼び出されたと想定されていました。 axios
PUT
#$。
最も参考になるコメント
将来このページを見つける可能性のある人々のためのこのエラーメッセージの理由を説明するこのコメントをここに追加します。
これは、promise内にディスパッチ関数がネストされているために発生します。
dispatch()は非同期であり、解決する必要があることに注意してください。 そのため、エラーメッセージが表示されていました。