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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:15:55