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

如何为调用React.useEffect的函数编写单元测试(附代码示例)

正确测试方案

现有代码问题

  • 直接调用函数组件而非通过React渲染流程执行,useEffect钩子不会被触发,无法验证滚动逻辑
  • 断言没有填写预期值,不符合测试语法要求
  • 没有对window.scrollTo做mock,既无法验证调用情况,也可能产生副作用

前置准备

确保安装@testing-library/react、jest相关依赖,这是React组件单元测试的通用工具栈。

完整测试代码

import React from "react";
import { render, screen } from "@testing-library/react";
import { ScrollToTop } from "./Scroll";

// 提前mock全局scrollTo方法,避免真实调用产生副作用
beforeAll(() => {
  window.scrollTo = jest.fn();
});

// 每次测试后重置mock调用记录,避免用例互相干扰
afterEach(() => {
  jest.clearAllMocks();
});

describe("ScrollToTop", () => {
  it("初始渲染时会滚动到页面顶部", () => {
    render(
      <ScrollToTop location={{ pathname: "/test" }}>
        <div>测试子内容</div>
      </ScrollToTop>
    );
    // 验证子元素正常渲染
    expect(screen.getByText("测试子内容")).toBeInTheDocument();
    // 验证scrollTo被正确调用
    expect(window.scrollTo).toHaveBeenCalledTimes(1);
    expect(window.scrollTo).toHaveBeenCalledWith(0, 0);
  });

  it("location.pathname变更时会重新触发滚动到顶部", () => {
    const { rerender } = render(
      <ScrollToTop location={{ pathname: "/path1" }}>
        <div>测试子内容</div>
      </ScrollToTop>
    );
    expect(window.scrollTo).toHaveBeenCalledTimes(1);
    
    // 传入新pathname重新渲染组件
    rerender(
      <ScrollToTop location={{ pathname: "/path2" }}>
        <div>测试子内容</div>
      </ScrollToTop>
    );
    // 验证依赖变化后scrollTo被再次调用
    expect(window.scrollTo).toHaveBeenCalledTimes(2);
    expect(window.scrollTo).toHaveBeenLastCalledWith(0, 0);
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:30:05