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 !
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
.
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.
Lembre-se de que dispatch() é assíncrono e precisa ser resolvido. É por isso que você estava recebendo a mensagem de erro.