You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Redux异步Action测试异常:仅触发LOGIN未触发LOGIN_SUCCESS

解决React Redux异步Action测试只触发LOGIN的问题

我来帮你排查下这个异步Action测试的问题,看了你的代码后,发现几个核心的不匹配点,调整后应该就能拿到预期的两个Action了:

1. Action返回结构与预期不匹配

你的loginSuccess函数返回的是{ type: LOGIN_SUCCESS, data },但测试用例里的expectedActions写的是body字段,这是第一个不匹配:

// 你的Action代码(正确结构)
function loginSuccess(data) {
  return { type: LOGIN_SUCCESS, data }; // 字段是data
}

// 测试用例里要改成对应结构
const expectedActions = [
  { type: actions.LOGIN },
  { 
    type: actions.LOGIN_SUCCESS, 
    data: { 
      data: { userName: '8888888888888888', token: '1ca9c02f-d6d2-4eb8-92fd-cec12441f091' },
      vin: '8888888888888888' // 因为你用了Object.assign(response.data, fields),会带上传入的vin
    } 
  },
];

2. 测试传入的参数与Action依赖不匹配

你的login Action里调用的是api.register(fields.vin),但测试时dispatch传入的是{ id: '8888888888888888' },没有vin字段,导致api.register拿到的参数是undefined,请求可能根本没正确发送:

// 测试里要传vin字段,和Action里的依赖对应
return store.dispatch(actions.login({ vin: '8888888888888888' })).then(() => {
  expect(store.getActions()).toEqual(expectedActions);
});

3. 请求方法/路径可能不匹配

如果你的Api类里的register方法是POST请求(注册接口一般是POST),那测试里的fetchMock.getOnce要改成fetchMock.postOnce,否则模拟的请求不会被命中:

// 改成postOnce(如果实际是POST请求的话)
fetchMock.postOnce('/register', {
  body: {
    data: {
      userName: '8888888888888888',
      token: '1ca9c02f-d6d2-4eb8-92fd-cec12441f091',
    },
  },
  headers: { 'content-type': 'application/json' },
});

4. 优化Action的异步逻辑(可选但推荐)

你的Action混合了async/await和then/catch,统一用async/await会让逻辑更清晰,也更容易调试:

export function login(fields) {
  return async dispatch => {
    dispatch({ type: LOGIN });
    try {
      const response = await api.register(fields.vin);
      const data = Object.assign(response.data, fields);
      dispatch(loginSuccess(data));
    } catch (error) {
      dispatch(loginError(error));
    }
  };
}

调整完这几点后,再运行测试,应该就能同时触发LOGIN和LOGIN_SUCCESS两个Action了。

内容的提问来源于stack exchange,提问作者Marcel Unger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:03:32