如何使用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
相关产品推荐
相关产品推荐

