I'm trying to write some test using react, redux-mock-store and redux, but I keep getting and error. Maybe because my Promise has not yet been resolved?
The fetchListing() action creator actually works when I try it on dev and production, but I'm having problems making the test pass.
error message
(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()) returns undefined. You can't call .then on that.
See redux-thunk code. It executes the function you return and returns that. The function you return in fetchListings returns nothing, i.e. undefined.
Try
return (dispatch) => { return request.then( (data) => { dispatch({ type: FETCH_LISTINGS, payload: data }); }); } After that you will still have another problem. You don't return anything inside your then, you only dispatch. That means the next then gets undefined argument
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With