如何修复AWS依赖层自定义库的测试模块找不到问题?
问题
我在nodejs/目录下创建了AWS依赖层,该目录包含node_modules/和带有npm依赖的package.json,同时在nodejs/下新建了utils/目录及util.js文件。由于是AWS层,Lambda的app.js中通过const cors = require('/opt/nodejs/utils/util');引入该模块,但本地执行测试用例时失败,报错:
Cannot find module '/opt/nodejs/utils/util' from 'backend/lambdas/cars/app.js'
测试代码:
const app = require('./app'); describe('lambda', function () { it('something', async () => { const response = await app.lambdaHandler(); .... }); });
app.js代码:
const httpStatusCode = require('http-status-codes'); const cors = require('/opt/nodejs/utils/util'); exports.lambdaHandler = async (event) => { return { statusCode: httpStatusCode.OK }; };
注:nodejs目录与lambdas目录处于同一层级。
解决方案
本地测试时不存在AWS Lambda环境中的/opt/nodejs路径,因此需要通过以下方法让Node.js找到本地的模块文件:
方法1:使用proxyquire替换模块引入(推荐)
这种方法无需修改业务代码,直接在测试中替换绝对路径的模块引用:
- 先安装
proxyquire开发依赖:
npm install proxyquire --save-dev
- 修改测试代码:
const proxyquire = require('proxyquire'); // 从本地同级nodejs目录引入util模块 const localUtil = require('../../nodejs/utils/util'); // 替换app.js中/opt/nodejs/utils/util的引用为本地模块 const app = proxyquire('./app', { '/opt/nodejs/utils/util': localUtil }); describe('lambda', function () { it('something', async () => { const response = await app.lambdaHandler(); // ... 你的测试逻辑 }); });
方法2:添加本地路径到模块搜索列表
通过修改module.paths,让Node.js在本地的nodejs目录中查找模块,这样原有的绝对路径require会被自动解析到本地路径:
修改测试代码:
const path = require('path'); // 将本地nodejs目录的绝对路径加入模块搜索路径 module.paths.push(path.resolve(__dirname, '../../nodejs')); const app = require('./app'); describe('lambda', function () { it('something', async () => { const response = await app.lambdaHandler(); // ... 你的测试逻辑 }); });
方法3:在业务代码中适配环境(可选)
如果允许修改app.js,可以根据环境变量切换模块引入路径:
const httpStatusCode = require('http-status-codes'); // 根据测试环境切换路径 const cors = process.env.NODE_ENV === 'test' ? require('../../nodejs/utils/util') : require('/opt/nodejs/utils/util'); exports.lambdaHandler = async (event) => { return { statusCode: httpStatusCode.OK }; };
执行测试时需要设置环境变量:
NODE_ENV=test npm test
内容的提问来源于stack exchange,提问作者asfafafags
相关产品推荐
相关产品推荐

