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

如何在Jest中测试React-Redux组件的SVG元素渲染

测试实现方案

你需要让Redux store中state.user.isLoading的值为true,再渲染组件验证SVG元素即可,以下是两种常用实现方案:

方案1:Mock useSelector 钩子(轻量快速)

直接Mock Redux的useSelector钩子返回指定状态,不需要依赖项目真实的store逻辑:

// User.spec.js 补充内容
import { useSelector } from "react-redux";
import { selectUsername, selectAuthState } from "./userSlice";

// mock react-redux模块,保留其他真实逻辑,只覆写useSelector
jest.mock("react-redux", () => ({
  ...jest.requireActual("react-redux"),
  useSelector: jest.fn(),
}));

test("renders spinner SVG when isLoading is true", () => {
  // 按组件内useSelector的调用顺序返回对应值
  useSelector.mockImplementation((selector) => {
    if (selector === selectUsername) return null;
    if (selector === selectAuthState) return false;
    // 第三个调用是取state.user,返回isLoading为true的状态
    return { isLoading: true };
  });

  // 不需要包裹Provider,因为useSelector已经被mock
  const { container } = render(<User />);
  const spinner = container.querySelector("svg.spinner");
  expect(spinner).toBeInTheDocument();
});

方案2:使用预设状态的测试Store(更贴近真实场景)

创建带指定初始状态的临时store,模拟真实运行时的Redux状态:

// User.spec.js 补充内容
import { configureStore } from "@reduxjs/toolkit";

test("renders spinner SVG when isLoading is true with test store", () => {
  // 初始化测试用store,覆盖user模块的isLoading状态
  const testStore = configureStore({
    reducer: store.reducer, // 复用项目原有根reducer
    preloadedState: {
      user: {
        isLoading: true,
        // 其他user模块的初始字段按你项目的实际默认值补充即可
        username: null,
        authState: false
      }
    }
  });

  const { container } = render(
    <Provider store={testStore}>
      <User />
    </Provider>
  );
  const spinner = container.querySelector("svg.spinner");
  expect(spinner).toBeInTheDocument();
});

优化提示

如果不想依赖class名查找元素,可在原组件的SVG标签上添加data-testid="loading-spinner"属性,测试时用getByTestId('loading-spinner')查找元素,稳定性更高,不会因为后续修改class名导致测试失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:36:03