使用Jest模拟fs.readFileSync时堆内存溢出如何修复
问题修复方案
错误原因
fs.readFileSync是Node.js内置的同步IO方法,调用后直接返回结果而非Promise对象,你使用了仅适用于异步方法的mockResolvedValue进行模拟,导致业务代码拿到不符合预期的Promise返回值,执行后续逻辑时出现无限循环或异常内存占用,最终触发JavaScript堆内存溢出。- 若你的业务代码中对
readFileSync的返回结果执行了JSON解析等操作,直接返回JS对象还会额外触发解析错误。
正确模拟方式
同步方法需要使用mockReturnValue指定返回值,如果业务代码中会对返回的文件内容做JSON解析,需要返回序列化后的JSON字符串:
const request = require('supertest'); const app = require('../../src/app'); const fs = require('fs'); jest.mock('fs'); describe('Get Accounts Info', () => { it('Get Accounts Info', async () => { // 替换mockResolvedValue为mockReturnValue,返回JSON字符串匹配真实读取场景 fs.readFileSync.mockReturnValue(JSON.stringify({ message: 'Test'})) const res = await request(app).get('/accounts') // 建议补充返回结果断言,比如校验状态码、响应体 expect(res.statusCode).toBe(200) }); });
补充说明:仅当你需要模拟异步的
fs.readFile方法时,才需要使用mockResolvedValue或者mockImplementation返回Promise。
运行验证
修改后执行原测试命令即可正常运行:npm test -- routes.test.js -t "Get Accounts Info"
内容的提问来源于stack exchange,提问作者Đoàn Đức Bảo
相关产品推荐
相关产品推荐

