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

使用Jest和@testing-library/react如何断言React中li元素的key属性值

核心原因

key是React内部用于虚拟DOM协调的专属属性,不会被渲染到真实DOM中,因此无法通过DOM元素的属性查询直接校验。你可以通过以下两种方案验证key是否正确设置:


方案1:直接捕获组件创建时的props验证(推荐)

通过模拟React.createElement,你可以直接捕获到传给<li>元素的所有属性(包括内部用的key),直接校验值即可。

在你的测试文件中新增如下测试用例:

it('should set correct key attribute for li elements', () => {
  // 先模拟返回测试数据
  mockGetPersons.mockReturnValue([
    { id: '1', name: { familyName: 'Duck', givenName: 'Donald' } },
    { id: '2', name: { familyName: 'Duck', givenName: 'Dagobert' } },
  ]);

  // 模拟React.createElement,保留原始逻辑的同时捕获调用参数
  const originalCreateElement = React.createElement;
  const liPropsList: Record<string, any>[] = [];
  jest.spyOn(React, 'createElement').mockImplementation((type, props, ...children) => {
    if (type === 'li' && props?.key) {
      liPropsList.push({ key: props.key, ...props });
    }
    return originalCreateElement(type, props, ...children);
  });

  render(<PersonList />);

  // 校验key值
  expect(liPropsList).toHaveLength(2);
  expect(liPropsList[0].key).toBe('1');
  expect(liPropsList[1].key).toBe('2');

  // 恢复mock避免影响其他测试
  jest.restoreAllMocks();
});

方案2:间接验证key的生效行为

如果你不想模拟React底层API,可以通过验证key的实际作用来判断是否设置正确:

  1. 先渲染初始列表,记录每个li元素的DOM引用
  2. 调整mock返回的persons数组顺序,重新渲染组件
  3. 校验对应内容的li元素是否还是原来的DOM引用(如果key正确,内容不变的元素会被复用,DOM引用不会变化;如果key没设置/设置错误,会重建DOM元素,引用发生变化)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:36:03