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

测试中修改mock的useLocation返回值失败,求可行方案

解决react-router-dom useLocation Mock在测试用例中不生效的问题

你的问题出在尝试重新mock整个react-router-dom模块,但jest的模块mock在代码导入阶段就已经完成了,后续用mockImplementation修改整个模块的返回不会生效。正确的做法是单独mock useLocation这个函数,让它可以在测试用例中动态修改返回值。

修改步骤:

  • 初始mock时,把useLocation定义为一个jest mock函数,并设置默认返回值
  • 在目标测试用例中,直接修改这个mock函数的返回值
  • (可选但推荐)在测试完成后清理mock状态,避免影响其他测试

修改后的完整代码:

// 初始mock:将useLocation设为可修改的jest mock函数
jest.mock("react-router-dom", () => ({
  ...jest.requireActual("react-router-dom"),
  useLocation: jest.fn().mockReturnValue({ pathname: "/" }),
}));

// 单独导入useLocation的mock函数
const { useLocation } = require("react-router-dom");

test("is disabled when on todo subpage", () => {
  // 修改useLocation的返回值为目标路径
  useLocation.mockReturnValue({
    pathname: "/todo/4RhdwMMMTcbJKvouqnWb",
  });

  // 渲染组件
  render(
    <SearchbarWithProviders
      language="en"
      setSearch={mockSetState}
      search=""
    />
  );

  // 断言输入框禁用状态
  expect(screen.getByTestId("search-input")).toBeDisabled();
  
  // (可选)测试后重置mock,恢复默认值
  useLocation.mockRestore();
});

为什么这样可行?

  • 初始mock时,我们把useLocation变成了一个可复用的jest mock函数,而不是固定的匿名函数
  • 在测试用例中,直接调用mockReturnValue修改这个函数的返回值,会立即生效,因为组件渲染时会调用这个mock函数
  • mockRestore可以把mock函数恢复到初始状态,避免这个测试用例的修改影响其他测试

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:46:06