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

Vitest无法Mock模块求助:调用vi.mock仍返回原函数

解决Vitest中vi.mock未生效的问题

针对你用vi.mock mock lodash但返回原函数的问题,给你几个可行的解决方法:

1. 手动指定Mock的命名导出

vi.mock默认会生成空mock,但对于lodash这类多命名导出的库,需要明确指定要mock的方法:

import { map } from "lodash";

// 手动定义lodash的mock实现,指定需要的命名导出
vi.mock("lodash", () => ({
  map: vi.fn()
}));

describe("Inventory", () => {
  it("should use mocked map function", () => {
    // 此时map已经是vitest的Mock函数
    console.log(map); // 输出: [Function: mockConstructor]
    
    // 还可以给mock函数设置自定义返回值
    map.mockReturnValue(["mocked", "item"]);
    const result = map([1,2,3], () => {});
    console.log(result); // 输出: ["mocked", "item"]
  });
});

2. 检查Vitest全局变量配置

如果代码里没显式导入vi(像你的示例那样),要确保vitest.config.js开启了全局变量模式,否则vi未定义会导致mock失效:

// vitest.config.js
export default {
  test: {
    globals: true, // 开启后无需手动导入vi、describe、it等
  },
};

3. 清除模块缓存

如果之前导入过lodash,模块缓存可能导致mock无法覆盖原有模块:

  • 确保vi.mock放在所有导入语句之后、测试代码之前的顶层位置
  • 运行测试时加--no-cache参数禁用缓存:
npx vitest --no-cache

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 09:15:08