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
相关产品推荐
相关产品推荐

