Jest: "Le rappel asynchrone n'a pas été invoqué dans le délai spécifié par Jasmine."

Créé le 23 août 2016  ·  3Commentaires  ·  Source: facebook/jest

Salut ! J'essaie de tester les actions Redux avec Jest, en utilisant Promises.
Ma fonction d'action est la suivante :

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
    }
}

Cette fonction postJSON est moquée :

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

et puis, dans mes spécifications, j'essaie de vérifier le résultat final lorsque toutes les promesses sont résolues :

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

La fonction fictive est appelée et renvoie la promesse, l'action renvoie quelque chose, mais j'obtiens cette erreur sur les spécifications :
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL. (en utilisant babel-jest 14.1.0 et jest-cli 12.0.2)

EDIT : J'ai également essayé de redéfinir la définition globale de Promise, et cela enfreint également les spécifications.

Merci pour ton aide !

Commentaire le plus utile

Ajout de ce commentaire ici décrivant la raison de ce message d'erreur pour les personnes qui pourraient trouver cette page à l'avenir.
Cela se produit parce que vous avez une fonction de répartition imbriquée dans votre promesse.

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

N'oubliez pas que dispatch() est asynchrone et doit être résolu. C'est pourquoi vous receviez le message d'erreur.

Tous les 3 commentaires

J'ai le problème, je dois résoudre la promesse dans la fonction mock :

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

Ajout de ce commentaire ici décrivant la raison de ce message d'erreur pour les personnes qui pourraient trouver cette page à l'avenir.
Cela se produit parce que vous avez une fonction de répartition imbriquée dans votre promesse.

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

N'oubliez pas que dispatch() est asynchrone et doit être résolu. C'est pourquoi vous receviez le message d'erreur.

Je suis juste ici pour dire que j'ai résolu cette erreur en utilisant l'appel done() .

Je testais une action redux, et à partir des console.log que j'utilisais, toutes les sorties étaient attendues, les resolve() et dispatch() étaient supposées être appelées dans le rappel de succès pour un PUT via axios .

Cette page vous a été utile?
0 / 5 - 0 notes