使用Bun测试框架Mock fs模块失效,测试失败求解决
问题:Bun测试中mock fs模块无效,实际调用真实函数
我尝试用Bun内置的兼容Jest的测试/模拟框架mock fs模块,编写了如下测试代码,但实际调用的仍是真实的mkdirSync函数,导致测试失败。请问遗漏了什么关键步骤?
import { expect, test, mock } from "bun:test"; import fs from "fs"; mock.module("fs", () => { console.log("Mocking") return { mkdirSync: (path: string) => { console.log("mkdirSync", path); return "mocked"; } }; }); console.log("Mocked fs") test("Mkdir", async () => { const dir = fs.mkdirSync("mock-dir", { recursive: true }); expect(dir).toBe("mocked"); });
解决方案
核心问题是模块导入顺序错误:Bun的mock.module需要在导入被mock的模块之前执行,否则真实模块会先被加载到缓存中,mock无法拦截。
你当前的代码先导入了fs,之后才调用mock.module,此时真实的fs已经被加载,mock对这个已导入的实例不起作用。
修正后的代码如下:
import { expect, test, mock } from "bun:test"; // 先执行mock,拦截fs模块的导入 mock.module("fs", () => { console.log("Mocking") return { mkdirSync: (path: string) => { console.log("mkdirSync", path); return "mocked"; } }; }); // 现在导入的是被mock后的fs模块 import fs from "fs"; console.log("Mocked fs") test("Mkdir", async () => { const dir = fs.mkdirSync("mock-dir", { recursive: true }); expect(dir).toBe("mocked"); });
额外注意:如果你的测试代码或依赖代码中有其他地方导入fs,也要确保那些导入操作发生在mock.module调用之后,否则同样会加载真实的模块实例。
内容的提问来源于stack exchange,提问作者Kong
相关产品推荐
相关产品推荐

