J'essaie d'écrire un test en utilisant react, redux-mock-store et redux, mais je continue à recevoir des erreurs. Peut-être parce que mon Promise
n'a pas encore été résolu?
Le créateur d'action fetchListing()
fonctionne réellement lorsque je l'essaie sur le développement et la production, mais j'ai des problèmes pour réussir le test.
message d'erreur
(node:19143) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): SyntaxError
(node:19143) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
FAIL src/actions/__tests__/action.test.js
● async actions › creates "FETCH_LISTINGS" when fetching listing has been done
TypeError: Cannot read property 'then' of undefined
at Object.<anonymous> (src/actions/__tests__/action.test.js:44:51)
at Promise (<anonymous>)
at Promise.resolve.then.el (node_modules/p-map/index.js:42:16)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:169:7)
async actions
✕ creates "FETCH_LISTINGS" when fetching listing has been done (10ms)
action/index.js
// actions/index.js
import axios from 'axios';
import { FETCH_LISTINGS } from './types';
export function fetchListings() {
const request = axios.get('/5/index.cfm?event=stream:listings');
return (dispatch) => {
request.then(( { data } ) => {
dispatch({ type: FETCH_LISTINGS, payload: data });
});
}
};
action.test.js
// actions/__test__/action.test.js
import configureMockStore from 'redux-mock-store';
import thunk from 'redux-thunk';
import { applyMiddleware } from 'redux';
import nock from 'nock';
import expect from 'expect';
import * as actions from '../index';
import * as types from '../types';
const middlewares = [ thunk ];
const mockStore = configureMockStore(middlewares);
describe('async actions', () => {
afterEach(() => {
nock.cleanAll()
})
it('creates "FETCH_LISTINGS" when fetching listing has been done', () => {
nock('http://example.com/')
.get('/listings')
.reply(200, { body: { listings: [{ 'corpo_id': 5629, id: 1382796, name: 'masm' }] } })
const expectedActions = [
{ type: types.FETCH_LISTINGS }, { body: { listings: [{ 'corpo_id': 5629, id: 1382796, name: 'masm' }] }}
]
const store = mockStore({ listings: [] })
return store.dispatch(actions.fetchListings()).then((data) => {
expect(store.getActions()).toEqual(expectedActions)
})
})
})
store.dispatch(actions.fetchListings())
renvoie undefined
. Vous ne pouvez pas appeler .then
sur ça.
Voir code redux-thunk . Il exécute la fonction que vous renvoyez et la renvoie. La fonction que vous renvoyez dans fetchListings
ne renvoie rien, c'est-à-dire undefined
.
Essayer
return (dispatch) => {
return request.then( (data) => {
dispatch({ type: FETCH_LISTINGS, payload: data });
});
}
Après cela, vous aurez toujours un autre problème. Vous ne renvoyez rien à l'intérieur de votre then
, vous n'envoyez que. Cela signifie que le prochain then
obtient undefined
argument
Je sais également que c'est un vieux fil, mais vous devez vous assurer de renvoyer l'action asynchrone à l'intérieur de votre thunk.
Dans mon thunk, je devais:
return fetch()
l'action asynchrone et cela a fonctionné
Je sais que c'est un vieux fil. Mais je pense que le problème est que votre créateur d'action n'est pas asynchrone.
Essayer:
export async function fetchListings() {
const request = axios.get('/5/index.cfm?event=stream:listings');
return (dispatch) => {
request.then(( { data } ) => {
dispatch({ type: FETCH_LISTINGS, payload: data });
});
}
}
Votre créateur d'action doit retourner un promesse comme indiqué ci-dessous:
// actions/index.js
import axios from 'axios';
import { FETCH_LISTINGS } from './types';
export function fetchListings() {
return (dispatch) => {
return axios.get('/5/index.cfm?event=stream:listings')
.then(( { data } ) => {
dispatch({ type: FETCH_LISTINGS, payload: data });
});
}
};