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

Jest手动模拟功能失效,请求技术协助

解决Jest手动模拟模块不生效的问题

看起来你遇到的问题是Jest没有正确加载你写的手动模拟模块,我来帮你排查下常见的问题点,一步步解决:

1. 调整jest.mock的位置

你现在把jest.mock放在了beforeEach里,但Jest会自动把jest.mock调用提升到模块作用域的最顶部——不过如果你的模块导入语句在jest.mock之前(哪怕代码顺序上看起来在后面),实际执行时模块已经被加载了,mock就不会生效。

正确的做法是把jest.mock放在测试文件的顶部,和导入语句同级:

// __tests__/mockTest.js
import ModuleA from "../src/ModuleA"

// 把jest.mock放在最顶部(导入之后也没问题,但要确保在测试逻辑之前)
jest.mock("../src/ModuleA")

describe("ModuleA", () => {
  // 不需要在beforeEach里重复调用jest.mock了
  it("should return the mock name", () => {
    const name = ModuleA.getModuleName()
    expect(name).toBe("mockModuleA")
  })
})

2. 确保模拟文件的路径和命名正确

你的模拟文件应该放在和原模块同级的__mocks__目录下,文件名必须和原模块完全一致:

  • 原模块路径:src/ModuleA.js
  • 模拟模块路径:src/__mocks__/ModuleA.js(注意是完整的ModuleA.js,不能只写一半)

然后模拟文件的实现要正确导出对应的方法:

// src/__mocks__/ModuleA.js
export default {
  getModuleName: () => "mockModuleA"
}

3. 可选:强制清除模块缓存(如果还是有问题)

如果之前的测试已经加载过原模块,Jest可能缓存了模块,你可以在beforeEach里清除缓存确保每次测试都重新加载mock:

describe("ModuleA", () => {
  beforeEach(() => {
    jest.resetModules()
    // 如果你需要重新mock的话,这里可以再调用一次,但通常放在顶部就够了
    jest.mock("../src/ModuleA")
  })

  it("should return the mock name", () => {
    // 注意这里要重新导入模块,因为resetModules了
    const ModuleA = require("../src/ModuleA").default
    const name = ModuleA.getModuleName()
    expect(name).toBe("mockModuleA")
  })
})

按照上面的步骤调整后,你的测试应该就能正确加载模拟模块,返回预期的"mockModuleA"了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:26:52