Jest: «Асинхронный обратный вызов не был вызван в течение времени ожидания, указанного Jasmine».

Созданный на 23 авг. 2016  ·  3Комментарии  ·  Источник: facebook/jest

Привет ! Я пытаюсь протестировать действия 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)

РЕДАКТИРОВАТЬ: Также пытался переопределить глобальное определение обещания, и это также нарушает спецификации.

Спасибо за вашу помощь !

Самый полезный комментарий

Добавление этого комментария сюда с описанием причины этого сообщения об ошибке для людей, которые могут найти эту страницу в будущем.
Это происходит потому, что у вас есть функция отправки, вложенная в ваше обещание.

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

Помните, что dispatch() является асинхронным и требует разрешения. Вот почему вы получали сообщение об ошибке.

Все 3 Комментарий

Получил проблему, мне нужно разрешить обещание в фиктивной функции:

// __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 .

Была ли эта страница полезной?
0 / 5 - 0 рейтинги