Jest测试GAS的TS代码时如何mock Logger.log方法解决运行报错
解决方案
根本原因
npx tsc编译正常是因为项目中引入了@types/google-apps-script类型包,类型系统可识别GAS全局对象定义,但Jest运行在Node.js环境,全局作用域默认不存在GAS专属的Logger对象,因此触发运行时ReferenceError。之前配置不生效的核心原因:
- jest.config.js的
globals配置仅作用于Jest的执行上下文参数,不会自动挂载到Node.js的globalThis全局对象 - 在
beforeAll中直接赋值Logger.log时,Logger本身未被初始化,属于对undefined挂载属性,因此触发Logger.log is not a function报错
全局通用mock方案(推荐)
该方案对所有测试用例生效,无需重复配置:
- 项目根目录新建全局mock文件
jest.globals.mock.js,写入以下内容:
// 挂载GAS全局Logger对象 global.Logger = { log: jest.fn() }
- 修改
jest.config.js配置,引入该mock文件:
module.exports = { // 保留原有配置项不变,新增/修改以下配置 setupFiles: ['<rootDir>/jest.globals.mock.js'], preset: 'ts-jest', testEnvironment: 'node' }
- 测试用例中可直接调用或校验
Logger.log的执行情况:
import { hello } from './你的待测文件路径' test('hello函数正常触发Logger输出', () => { hello() // 校验log方法被调用、且传入参数符合预期 expect(Logger.log).toHaveBeenCalledTimes(1) expect(Logger.log).toHaveBeenCalledWith('你预期的输出内容') // 可选:清空mock调用记录,避免影响其他用例 jest.clearAllMocks() })
单文件局部mock方案
如果仅需为单个测试文件适配mock,无需修改全局配置,可在测试文件最顶部(所有import语句之前)写入以下代码:
// 扩充全局类型声明 declare global { var Logger: { log: jest.Mock } } // 初始化全局Logger对象 global.Logger = { log: jest.fn() } // 后续再写入import语句和测试逻辑 import { hello } from './你的待测文件路径' // 测试用例...
内容的提问来源于stack exchange,提问作者YAMADA Masahiro
相关产品推荐
相关产品推荐

