测试Redux的requestRobots Action时为何获取到Undefined?
Redux异步Action测试失败:仅能获取REQUEST_ROBOTS_PENDING,SUCCESS返回Undefined的解决方法
问题原因
- 测试未等待异步操作完成:调用
store.dispatch(actions.requestRobots())后直接获取actions,此时异步请求还未返回,REQUEST_ROBOTS_SUCCESS还未被dispatch,导致action[1]为undefined。 - Nock配置错误:原测试中Nock的base URL写了
https://jsonplaceholder.typicode.com/users,搭配get('/users')会生成错误的请求路径https://jsonplaceholder.typicode.com/users/users,导致Mock未生效,请求走真实接口,延迟进一步加剧问题。 - 未配置Thunk中间件:redux-mock-store默认不支持异步Action Creator,必须手动配置Thunk中间件才能处理带dispatch参数的异步函数。
修复步骤
1. 确保MockStore配置Thunk中间件
import configureMockStore from 'redux-mock-store'; import thunk from 'redux-thunk'; // 传入Thunk中间件,让mockStore支持异步Action const mockStore = configureMockStore([thunk]);
2. 修改测试用例,等待异步操作完成
describe('Fetch robots action success', () => { it('handle request robot action success', async () => { const store = mockStore(); const mockApiData = [ { id: 1, name: 'John', email: 'john@gmail.com', }, ]; // 修正Nock的base URL,确保路径匹配 nock('https://jsonplaceholder.typicode.com') .get('/users') .reply(200, mockApiData); // 等待异步Action执行完成 await store.dispatch(actions.requestRobots()); const expectedSuccessAction = { type: REQUEST_ROBOTS_SUCCESS, payload: mockApiData, }; const actions = store.getActions(); // 先验证Pending Action expect(actions[0]).toEqual({ type: REQUEST_ROBOTS_PENDING }); // 再验证Success Action expect(actions[1]).toEqual(expectedSuccessAction); }); });
3. (可选)优化异步Action代码(可读性提升)
将原Promise链式调用改为async/await风格,逻辑更清晰:
export const requestRobots = () => async (dispatch) => { dispatch({ type: REQUEST_ROBOTS_PENDING }); try { const data = await apiCall('https://jsonplaceholder.typicode.com/users'); dispatch({ type: REQUEST_ROBOTS_SUCCESS, payload: data }); } catch (error) { dispatch({ type: REQUEST_ROBOTS_FAILED, payload: error }); } };
内容的提问来源于stack exchange,提问作者miogway27202224
相关产品推荐
相关产品推荐

