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

如何测试接收useState函数作为prop的React组件

基础问题修正

你当前写的onSetText: () => {() => {}} 是错误的,该函数执行后会返回另一个空函数,并未匹配组件要求的「接收text参数直接执行更新逻辑」的函数签名,首先需要修正这个基础写法。


方案1:仅需组件正常渲染,不需要验证回调行为

直接传入最简空函数即可,可按需匹配参数签名:

const baseProps = {
  text: "Name",
  // 带TS类型标注写法,不需要的话可以去掉参数类型
  onSetText: (text: string) => {}
};

方案2:需要验证回调的调用次数、传参是否正确

使用测试框架的Mock函数即可,以Jest为例:

test("Renders the InlineEdit 'View' span when state is false", () => {
  Enzyme.configure({ adapter: new Adapter() })
  // 创建mock函数
  const mockOnSetText = jest.fn();
  const baseProps = {
    text: "Name",
    onSetText: mockOnSetText
  };
  const wrapper = render(<InlineEdit  {...baseProps}/>);
  
  // 模拟触发组件的编辑保存操作后,可做如下断言
  // 验证是否被调用
  expect(mockOnSetText).toHaveBeenCalled();
  // 验证传参是否符合预期,比如修改后的文本是"新名称"
  expect(mockOnSetText).toHaveBeenCalledWith("新名称");
});

方案3:需要模拟真实父组件状态更新,测试重渲染逻辑

可以在测试代码中直接使用真实的useState,完全复现业务场景的调用逻辑:

import { useState } from 'react';

test("测试编辑后文本同步更新", () => {
  Enzyme.configure({ adapter: new Adapter() })
  const [measure, setMeasure] = useState<Measure>({ id: "", name: "初始名称" });
  const wrapper = render(<InlineEdit 
    text={measure.name}
    onSetText={(text) => setMeasure({ ...measure, name: text })}
  />);

  // 模拟触发编辑、保存操作
  // 后续可直接断言组件渲染的text是否和更新后的measure.name一致
});

额外优化建议

Enzyme的适配器配置不需要放在每个单测用例中,建议提到测试文件顶部的beforeEach全局钩子,或者放入项目的测试全局配置文件中,减少冗余代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:27:05