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找到真实模块
校验
<rootDir>路径准确性<rootDir>默认指向jest.config.js所在目录,确认../lib/src/logger.ts确实是Layer中logger文件的相对路径。如果路径正确但仍报错,可尝试映射到Layer编译后的JS文件(若存在)。修正正则匹配规则
去掉正则中的多余斜杠,避免路径解析错误:moduleNameMapper: { '^opt/nodejs/(.*)$': '<rootDir>/../lib/src/$1' }扩展
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
- 在项目根目录创建
__mocks__/opt/nodejs/logger.ts文件,内容如下:export const logger = { debug: jest.fn(), info: jest.fn(), error: jest.fn() }; - 在
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
相关产品推荐
相关产品推荐

