Jest: "O retorno de chamada assíncrono não foi invocado dentro do tempo limite especificado por Jasmine."

Criado em 23 ago. 2016  ·  3Comentários  ·  Fonte: facebook/jest

Ei ! Estou tentando testar ações do Redux com Jest, usando Promises.
Minha função de ação é a seguinte:

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 função postJSON é simulada:

// __mocks__/fetch.js
export function postJSON (url, data) {
    return new Promise((resolve, reject) => {
        process.nextTick(
            () => {}
        )
    })
}

e então, nas minhas especificações estou tentando verificar o resultado final quando todas as promessas forem resolvidas:

// __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)
            })
    })
})

A função mock é chamada e retorna a promessa, a ação está retornando algo, mas estou recebendo este erro nas especificações:
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL. (usando babel-jest 14.1.0 e jest-cli 12.0.2)

EDIT: Também tentei redefinir a definição global de Promise, e também está quebrando as especificações.

Obrigado pela ajuda !

Comentários muito úteis

Adicionando este comentário aqui descrevendo o motivo desta mensagem de erro para as pessoas que podem encontrar esta página no futuro.
Isso acontece porque você tem uma função de despacho aninhada dentro de sua promessa.

      dispatch({
          type: 'GET_EXPORT_ID',
           payload: data
       })

Lembre-se de que dispatch() é assíncrono e precisa ser resolvido. É por isso que você estava recebendo a mensagem de erro.

Todos 3 comentários

Tenho o problema, preciso resolver a promessa na função mock:

// __mocks__/fetch.js
export function postJSON (url, data) {
    return new Promise((resolve, reject) => {
        process.nextTick(
            () => resolve({})
        )
    })
}

Adicionando este comentário aqui descrevendo o motivo desta mensagem de erro para as pessoas que podem encontrar esta página no futuro.
Isso acontece porque você tem uma função de despacho aninhada dentro de sua promessa.

      dispatch({
          type: 'GET_EXPORT_ID',
           payload: data
       })

Lembre-se de que dispatch() é assíncrono e precisa ser resolvido. É por isso que você estava recebendo a mensagem de erro.

Estou aqui apenas para informar que resolvi esse erro utilizando a chamada done() .

Eu estava testando uma ação redux, e dos console.log s que eu estava usando, todas as saídas eram esperadas, os resolve() e dispatch() estavam supostamente sendo chamados dentro do callback de sucesso para PUT via axios .

Esta página foi útil?
0 / 5 - 0 avaliações