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

React单元测试报Cannot read property 'down' of undefined问题求助

问题排查与修复方案

你遇到的错误和测试代码的问题共有三处,对应修复逻辑如下:

  • 第一:API混用错误
    getByTestId是React Testing Library专属的查询方法,你当前用Enzyme的mount方法渲染组件,Enzyme实例不存在该方法,会导致查询逻辑报错。
  • 第二:缺少axios mock返回值定义
    你仅声明了mock axios模块,没有给axios对应的请求方法设置返回值。如果你的SegmentationLanding组件初始化时会调用axios接口,接口返回为空时,组件内部读取返回数据的嵌套属性就会触发Cannot read property "down" of undefined报错,这是你当前遇到错误的核心原因。
  • 第三:测试逻辑冗余
    你在beforeEach中用shallow渲染的wrapper变量在测试用例中完全未使用,属于无效代码可以直接删除。

修复后完整测试代码(Enzyme版本)

import React from "react";
import Enzyme, { mount } from "enzyme";
import Adapter from "enzyme-adapter-react-16";
import axios from "axios.js";
import "@testing-library/jest-dom";
import SegmentationLanding from "./SegmentationLanding";
import { BrowserRouter } from "react-router-dom";

Enzyme.configure({ adapter: new Adapter() });

jest.mock("axios.js");
// 按照实际接口返回结构填充mock值,补全组件需要的所有字段
axios.get.mockResolvedValue({
  data: {
    // 示例字段,请替换为你实际接口返回的内容
    list: [],
    // 如果你组件代码中用到了xx.down的写法,必须在这里定义对应层级的属性
    xx: { down: false }
  }
});

const flushPromises = () => {
  return new Promise((resolve) => setImmediate(resolve));
};

describe(`The segmentation lists`, () => {
  test("verify button is disabled", async () => {
    const wrapper = mount(
      <BrowserRouter>
        <SegmentationLanding />
      </BrowserRouter>
    );
    // 等待所有异步请求执行完成
    await flushPromises();
    // Enzyme查询带对应testId的元素
    const btn = wrapper.find('[data-testid="jest-tester"]').getDOMNode();
    expect(btn).toBeDisabled();
  });
});

如果修复mock返回后依然报错,可以在组件的接口请求回调中打印返回数据,确认你用到的所有嵌套字段都已经在mock值中定义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:54:03