Hola ! Estoy tratando de probar las acciones de Redux con Jest, usando Promises.
Mi función de acción es la siguiente:
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
}
}
Esta función postJSON
se burla:
// __mocks__/fetch.js
export function postJSON (url, data) {
return new Promise((resolve, reject) => {
process.nextTick(
() => {}
)
})
}
y luego, en mis especificaciones, intento verificar el resultado final cuando se resuelven todas las promesas:
// __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)
})
})
})
Se llama a la función simulada y se devuelve la promesa, la acción devuelve algo, pero aparece este error en las especificaciones:
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
(usando babel-jest 14.1.0 y jest-cli 12.0.2)
EDITAR: También intenté redefinir la definición global de Promise, y también está rompiendo las especificaciones.
Gracias por tu ayuda !
Tengo el problema, necesito resolver la promesa en la función simulada:
// __mocks__/fetch.js
export function postJSON (url, data) {
return new Promise((resolve, reject) => {
process.nextTick(
() => resolve({})
)
})
}
Agregar este comentario aquí describiendo el motivo de este mensaje de error para las personas que puedan encontrar esta página en el futuro.
Eso sucede porque tiene una función de envío anidada dentro de su promesa.
dispatch({
type: 'GET_EXPORT_ID',
payload: data
})
Recuerde que dispatch() es asíncrono y debe resolverse. Es por eso que estaba recibiendo el mensaje de error.
Solo estoy aquí para decir que resolví este error utilizando la llamada done()
.
Estaba probando una acción redux, y de los console.log
que estaba usando, se esperaban todos los resultados, se suponía que resolve()
y dispatch()
se llamaban dentro de la devolución de llamada exitosa para PUT
a través axios
.
Comentario más útil
Agregar este comentario aquí describiendo el motivo de este mensaje de error para las personas que puedan encontrar esta página en el futuro.
Eso sucede porque tiene una función de envío anidada dentro de su promesa.
Recuerde que dispatch() es asíncrono y debe resolverse. Es por eso que estaba recibiendo el mensaje de error.