Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unit test for aws lambda using jest

const invokeApi = require("/opt/nodejs/kiwiCall");
const decrypt = require("/opt/nodejs/encryption");
const cors = require("/opt/nodejs/cors");

When I am testing my index.js file by manual mocking these dependencies in mocks directory as follows:

__mocks__ 
    |_invokeApi
    |_decrypt
    |_cors

it says

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");

Wanted to know how can I mock the dependencies of AWS lambda in inedx.test.js file

like image 692
Mohd Anas Quraishi Avatar asked Oct 17 '25 14:10

Mohd Anas Quraishi


2 Answers

In your package.json or jest.config you could add a moduleNameMapper for that directory.

  "jest": {
    "moduleNameMapper": {
      "/opt/nodejs/(.*)": "<rootDir>/../nodejs/$1"
    },
  },
like image 156
Phil Avatar answered Oct 20 '25 06:10

Phil


So I managed to figure out something based on my repository.

I'm using the moduleNameMapper to map the absolute path to another location in my repository to where I have the layer stored.

Eg.

moduleNameMapper: {'^/opt/config/config': '<rootDir>/src/layers/layers-core/config/config'}

In your case you could use a regex expression to match /opt/nodejs/ and map it elsewhere. Hope that helped.

EDIT:

I completely changed my approach and used babel-plugin-module-resolver with babel-rewire. I did this because the above method was incompatible with rewire. It's quite easy setup and you just need to setup a babel alias within .babelrc.

eg.

{
  "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"
      }
    }]
  ]
}

Combine this with IDE jsconfig.json path alias and you get full IDE support.

{
  "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"]
}

You can then reference your layers with jest.doMock('/opt/config/config', mockConfig);

EDIT 2: Found a way to get Jest to mock it. Just slip {virtual: true} into the mock!

jest.doMock('/opt/config/config', mockConfig, {virtual: true});

like image 36
Sam Chung Avatar answered Oct 20 '25 05:10

Sam Chung