首页 > 解决方案 > 使用 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 的依赖项

标签: node.jsunit-testingaws-lambdajestjs

解决方案


所以我设法根据我的存储库找出一些东西。

我正在使用 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});


推荐阅读