Привет ! Я пытаюсь протестировать действия Redux с помощью Jest, используя Promises.
Моя функция действия следующая:
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)
})
})
})
Функция mock вызывается и возвращает обещание, действие что-то возвращает, но я получаю эту ошибку в спецификациях:
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
(с использованием babel-jest 14.1.0 и jest-cli 12.0.2)
РЕДАКТИРОВАТЬ: Также пытался переопределить глобальное определение обещания, и это также нарушает спецификации.
Спасибо за вашу помощь !
Получил проблему, мне нужно разрешить обещание в фиктивной функции:
// __mocks__/fetch.js
export function postJSON (url, data) {
return new Promise((resolve, reject) => {
process.nextTick(
() => resolve({})
)
})
}
Добавление этого комментария сюда с описанием причины этого сообщения об ошибке для людей, которые могут найти эту страницу в будущем.
Это происходит потому, что у вас есть функция отправки, вложенная в ваше обещание.
dispatch({
type: 'GET_EXPORT_ID',
payload: data
})
Помните, что dispatch() является асинхронным и требует разрешения. Вот почему вы получали сообщение об ошибке.
Я здесь только для того, чтобы сообщить, что я решил эту ошибку, используя вызов done()
.
Я тестировал избыточное действие, и от console.log
s, которые я использовал, все результаты были ожидаемы, resolve()
и dispatch()
предположительно вызывались в обратном вызове успеха для PUT
через axios
.
Самый полезный комментарий
Добавление этого комментария сюда с описанием причины этого сообщения об ошибке для людей, которые могут найти эту страницу в будущем.
Это происходит потому, что у вас есть функция отправки, вложенная в ваше обещание.
Помните, что dispatch() является асинхронным и требует разрешения. Вот почему вы получали сообщение об ошибке.