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

mockAxios.post.mockImplementationOnce未返回数据问题求助

解决AddStudentForm测试中Mock Axios不返回数据及await后状态异常的问题

首先,你的测试遇到两个核心问题:组件实例不共享导致状态无法跟踪,以及未正确等待异步操作完成。下面逐一分析并给出修复方案:

1. 为什么mockAxios.post没有返回预期数据?

你每次调用addStudentForm()都会创建一个全新的组件实例,这意味着:

  • 第一次点击open-modal是在实例A上,打开了模态框;
  • 第二次点击submit是在实例B上,这个实例的模态框根本没打开,也不会执行提交后的异步逻辑;
  • 最后打印的state是实例C的初始状态,自然看不到错误数据。

修复方法:保存组件实例到变量

将组件实例保存为一个变量,所有操作都基于这个实例进行,确保状态共享:

it('should show errors when submitting returns a 422 response', async () => {
  // 配置mock返回422错误数据
  mockAxios.post.mockImplementationOnce(() => 
    Promise.resolve({
      data: { errors: ['Name is required.', 'Email is required.'] },
      status: 422,
    })
  );

  // 只创建一次组件实例
  const wrapper = addStudentForm();

  // 打开模态框
  wrapper.find('button.open-modal').simulate('click');
  wrapper.update(); // 强制更新组件,同步状态
  expect(wrapper.instance().state.showModal).toBe(true);

  // 模拟提交
  wrapper.find('button.submit').simulate('click');
  
  // 等待异步请求的Promise完成
  await Promise.resolve();
  wrapper.update(); // 更新组件以反映异步操作后的状态

  // 现在可以正确获取到错误状态
  expect(wrapper.instance().state.errors).toEqual([
    'Name is required.', 
    'Email is required.'
  ]);
});

2. 为什么添加await后showModal变为false?

你之前的写法可能是直接await addStudentForm().find('button.submit').simulate('click'),但simulate方法并不返回Promise,而且再次调用addStudentForm()又创建了新的组件实例,这个新实例的showModal默认是false,所以断言失败。

正确的异步等待方式

异步操作完成后需要等待Promise settle,然后调用wrapper.update()同步组件状态。如果你的组件在错误处理后没有关闭模态框,断言showModal为true就会生效;如果组件逻辑是错误后关闭模态框,那这个断言本身就不符合预期,需要调整。

额外的最佳实践:避免直接操作组件state

直接访问instance().state属于测试内部实现,耦合度高。更推荐通过组件的渲染结果来断言,比如检查页面上是否显示了错误提示:

// 代替检查state,检查DOM中的错误信息
expect(wrapper.find('.error-item').at(0).text()).toBe('Name is required.');
expect(wrapper.find('.error-item').at(1).text()).toBe('Email is required.');

内容的提问来源于stack exchange,提问作者Joseph Chambers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:52:27