You need to enable JavaScript to run this app. Enzyme浅渲染测试React onChange事件时状态始终保持默认值
优惠活动
大模型
产品
解决方案
定价
更多

Enzyme浅渲染测试React onChange事件时状态始终保持默认值

测试失效的核心原因与修复方案

1. 状态更新逻辑不匹配:缺少name属性传递

你的handleChange是通过e.target.name作为动态键来更新对应state的,这套逻辑要求两个前置条件同时满足:

  • 组件内绑定onChange的输入框,必须配置和state字段名完全一致的name属性
  • 测试模拟change事件时,必须在target对象里传入对应输入框的name值
    当前你既没有给组件里的两个数字输入框加name属性,测试模拟事件时也只传了value没传name,导致执行setState时生成的键是undefined,根本没有更新到inputFirstNum这个state字段,自然输入值始终是初始默认的1。

修复示例

先修正组件内的input标签,补上对应name:

<input type="number" 
      name="inputFirstNum"
      onChange={this.handleChange} 
      value={this.state.inputFirstNum} />
<input type="number" 
      name="inputLastNum"
      onChange={this.handleChange} 
      value={this.state.inputLastNum} />

再修正测试用例的模拟事件参数,补上name字段:

wrapper.find('input[type="number"]').at(0).simulate('change', { 
  target: { name: 'inputFirstNum', value: 111 } 
});

2. Shallow渲染缓存问题(按需处理)

如果补完name参数后测试还是不通过,是因为Enzyme的shallow wrapper会缓存组件渲染结果,触发setState后需要手动调用update()方法同步最新的渲染状态,再执行断言。

修正后的完整测试用例

it('should change the value on 1st-input', () => {
  const wrapper = shallow(<CalcForm />);
  wrapper.find('input[type="number"]').at(0).simulate('change', { 
    target: { name: 'inputFirstNum', value: 111 } 
  });
  // 强制同步最新渲染结果
  wrapper.update();
  expect(wrapper.find('input[type="number"]').at(0).prop('value')).toEqual(111);
});

补充说明:你的组件render部分存在语法笔误,提交按钮后面多了一个没有对应开标签的</div>,会导致DOM结构异常,建议修正form内的标签嵌套,保证所有闭合标签都有对应的开标签。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 00:54:03