Jest: "La devolución de llamada asincrónica no se invocó dentro del tiempo de espera especificado por Jasmine".

Creado en 23 ago. 2016  ·  3Comentarios  ·  Fuente: facebook/jest

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 !

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.

      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.

Todos 3 comentarios

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 .

¿Fue útil esta página
0 / 5 - 0 calificaciones