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

如何使用Jest模拟promisified的fs.mkdir函数

解决promisified版fs.mkdir的Jest Mock问题

你当前的Mock失败原因是:fs.mkdir是Node.js的异步回调式API,promisify需要它遵循最后一个参数为(err, result)回调的规范才能正确转换为Promise。你之前的Mock直接返回空字符串,没有调用回调,导致promisify生成的Promise永远无法resolve,自然会在await处失败。

以下是两种可行的Mock方案:

方案一:Mock回调版fs.mkdir(推荐)

直接模拟fs.mkdir的回调行为,让它无错误触发回调,这样promisify后的函数会正常resolve:

// application.spec.ts
import fs from 'fs';
import { yourBusinessFunction } from './application'; // 导入你的业务函数

jest.mock('fs');

test('mkdir执行成功', async () => {
  // 模拟fs.mkdir的回调逻辑:无错误,返回true
  jest.spyOn(fs, 'mkdir').mockImplementation((...args) => {
    const callback = args.pop(); // 取出最后一个参数作为回调函数
    callback(null, true);
  });

  await yourBusinessFunction(); // 调用业务代码

  // 可选:断言fs.mkdir是否按预期调用
  expect(fs.mkdir).toHaveBeenCalledWith(
    expect.any(String),
    { recursive: true },
    expect.any(Function)
  );
});

如果需要测试错误分支,只需修改回调的第一个参数为Error对象:

jest.spyOn(fs, 'mkdir').mockImplementation((...args) => {
  const callback = args.pop();
  callback(new Error('目录创建失败'));
});

方案二:直接Mock promisify后的函数

如果业务代码中mkdir是局部定义的(如const mkdir = promisify(fs.mkdir)),也可以通过Mockutil.promisify来直接返回一个resolve的Promise:

// application.spec.ts
import util from 'util';
import fs from 'fs';
import { yourBusinessFunction } from './application';

jest.mock('fs');
jest.spyOn(util, 'promisify').mockReturnValue(() => Promise.resolve(true));

test('mkdir执行成功', async () => {
  await yourBusinessFunction();
});

注意:这种方式会影响所有promisify的调用,适合全局Mock的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 19:42:48