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

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方案(推荐)

该方案对所有测试用例生效,无需重复配置:

  1. 项目根目录新建全局mock文件jest.globals.mock.js,写入以下内容:
// 挂载GAS全局Logger对象
global.Logger = {
  log: jest.fn()
}
  1. 修改jest.config.js配置,引入该mock文件:
module.exports = {
  // 保留原有配置项不变,新增/修改以下配置
  setupFiles: ['<rootDir>/jest.globals.mock.js'],
  preset: 'ts-jest',
  testEnvironment: 'node'
}
  1. 测试用例中可直接调用或校验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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:24:05