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

Jest中单元测试Mock Lambda Layer库失败问题求助

解决Jest测试Lambda函数时Mock Layer依赖包的问题

问题场景

我在用Jest对Lambda函数做单元测试,Lambda代码中引入了Lambda Layer里的日志包:

import { logger } from 'opt/nodejs/logger';
...
logger.debug('a message');

执行测试时抛出错误:

TypeError: Cannot read properties of undefined (reading 'debug')

尝试通过moduleNameMapper配置映射依赖,但未成功,当前jest.config.js内容如下:

/** @type {import('ts-jest').JestConfigWithTsJest} */
module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'node',
  modulePaths: ['node_modules', '.'],
  moduleNameMapper: {
    '^opt/nodejs/logger$': '<rootDir>/../lib/src/logger.ts',
  },
}

还试过绝对路径以及'^opt/nodejs/(.*)$': '<rootDir>/../lib/src//$1'的写法,均无效。


解决方案

方案一:修正moduleNameMapper配置,让Jest找到真实模块

  1. 校验<rootDir>路径准确性
    <rootDir>默认指向jest.config.js所在目录,确认../lib/src/logger.ts确实是Layer中logger文件的相对路径。如果路径正确但仍报错,可尝试映射到Layer编译后的JS文件(若存在)。

  2. 修正正则匹配规则
    去掉正则中的多余斜杠,避免路径解析错误:

    moduleNameMapper: {
      '^opt/nodejs/(.*)$': '<rootDir>/../lib/src/$1'
    }
    
  3. 扩展modulePaths范围
    将Layer的源码目录加入Jest的模块搜索路径,简化映射规则:

    module.exports = {
      // ...其他配置
      modulePaths: ['node_modules', '.', '<rootDir>/../lib/src'],
      moduleNameMapper: {
        '^opt/nodejs/logger$': 'logger'
      }
    }
    

方案二:直接Mock整个logger模块(更简便,适合单元测试)

无需依赖真实Layer文件,直接Mock日志模块的方法:

方法1:单测试文件内局部Mock

在测试文件开头添加Mock代码:

// Mock日志模块
jest.mock('opt/nodejs/logger', () => ({
  logger: {
    debug: jest.fn(),
    info: jest.fn(),
    error: jest.fn()
  }
}));

// 引入模块并验证调用
import { logger } from 'opt/nodejs/logger';

test('验证logger.debug调用', () => {
  // 执行你的Lambda函数逻辑
  expect(logger.debug).toHaveBeenCalledWith('a message');
});

方法2:全局自动Mock

  1. 在项目根目录创建__mocks__/opt/nodejs/logger.ts文件,内容如下:
    export const logger = {
      debug: jest.fn(),
      info: jest.fn(),
      error: jest.fn()
    };
    
  2. 在jest.config.js中开启自动Mock(按需配置):
    module.exports = {
      // ...其他配置
      automock: false, // 设为true会自动Mock所有模块,按需选择
      setupFilesAfterEnv: ['<rootDir>/jest.setup.js'] // 可选,用于全局Mock初始化
    };
    
    之后所有测试文件引入opt/nodejs/logger时,都会自动使用该Mock。

额外注意事项

  • 检查logger的导出方式:如果Layer中的logger是默认导出(export default logger),则Lambda代码中应使用import logger from 'opt/nodejs/logger',Mock时也要对应调整导出结构。
  • 若Lambda代码使用ES模块语法,需确保tsconfig.json中module字段与Jest配置兼容(比如设为CommonJS),避免模块解析冲突。

内容的提问来源于stack exchange,提问作者Oussema Miled

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 05:03:33