node.js - 使用 jest 对 aws lambda 进行单元测试
问题描述
const invokeApi = require("/opt/nodejs/kiwiCall");
const decrypt = require("/opt/nodejs/encryption");
const cors = require("/opt/nodejs/cors");
当我通过在mocks目录中手动模拟这些依赖项来测试我的 index.js 文件时,如下所示:
__mocks__
|_invokeApi
|_decrypt
|_cors
它说
FAIL ./index.test.js
● Test suite failed to run
Cannot find module '/opt/nodejs/kiwiCall' from 'index.js'
However, Jest was able to find:
'../../../../lambdas/Flights/Locations/index.js'
You might want to include a file extension in your import, or update your 'moduleFileExtensions', which is currently ['js', 'json', 'jsx', 'ts', 'tsx', 'node'].
See https://jestjs.io/docs/en/configuration#modulefileextensions-array-string
1 | "use strict";
2 |
> 3 | const invokeApi = require("/opt/nodejs/kiwiCall");
想知道如何在 inedx.test.js 文件中模拟 AWS lambda 的依赖项
解决方案
所以我设法根据我的存储库找出一些东西。
我正在使用 moduleNameMapper 将绝对路径映射到我的存储库中另一个位置到我存储层的位置。
例如。
moduleNameMapper: {'^/opt/config/config': '<rootDir>/src/layers/layers-core/config/config'}
在您的情况下,您可以使用正则表达式来匹配/opt/nodejs/
并将其映射到其他地方。希望有帮助。
编辑:
我完全改变了我的方法并将 babel-plugin-module-resolver 与 babel-rewire 一起使用。我这样做是因为上述方法与重新布线不兼容。设置非常简单,你只需要在.babelrc
.
例如。
{
"plugins": [
["rewire"],
["babel-plugin-module-resolver", {
"alias": {
"/opt/config/config": "./src/layers/layers-core/config/config",
"/opt/utils/util-logger": "./src/layers/layers-core/utils/util-logger",
"/opt/slack": "./src/layers/layers-slack/slack"
}
}]
]
}
将此与 IDEjsconfig.json
路径别名结合起来,您将获得完整的 IDE 支持。
{
"compilerOptions": {
"module": "commonjs",
"target": "es2018",
"baseUrl": "./",
"paths": {
"/opt/config/config": ["src/layers/layers-core/config/config"],
"/opt/utils/util-logger": ["src/layers/layers-core/utils/util-logger"],
"/opt/slack/*": ["src/layers/layers-slack/slack/*"],
}
},
"exclude": ["node_modules", "dist"]
}
然后,您可以参考您的图层jest.doMock('/opt/config/config', mockConfig);
编辑 2:找到了一种让 Jest 模拟它的方法。只是{virtual: true}
溜进模拟!
jest.doMock('/opt/config/config', mockConfig, {virtual: true});
推荐阅读
- python - 将文本文件中的列拆分为数组
- maven - Jenkins - 如何在第二个 maven 命令中使用第一个 maven 命令的输出?
- reactjs - 反应 devtools 跟踪 redux 操作
- laravel - Laravel 嵌套资源控制器策略
- django - 如何在 Django 模型上添加复杂的约束?
- swiftui - 当@FetchRequest 谓词过滤器更改时,将 SwiftUI @FetchedResults 计数从子视图返回到父视图
- android - 从按钮继承 onClick 属性
- javascript - React 组件输入验证(useState())落后一步
- php - 如何使用 php file_exist
- python - C函数在python DLL上返回不同的值