206

Receiving the following error when running Jest

Cannot find module 'src/views/app' from 'index.jsx'

  at Resolver.resolveModule (node_modules/jest-resolve/build/index.js:179:17)
  at Object.<anonymous> (src/index.jsx:4:12)

index.jsx

import AppContainer from 'src/views/app';

package.json

  "jest": {
    "collectCoverageFrom": [
      "src/**/*.{js,jsx,mjs}"
    ],
    "setupFiles": [
      "<rootDir>/config/polyfills.js"
    ],
    "testMatch": [
      "<rootDir>/src/**/__tests__/**/*.{js,jsx,mjs}",
      "<rootDir>/src/**/?(*.)(spec|test).{js,jsx,mjs}"
    ],
    "testEnvironment": "node",
    "testURL": "http://localhost",
    "transform": {
      "^.+\\.(js|jsx|mjs)$": "<rootDir>/node_modules/babel-jest",
      "^.+\\.css$": "<rootDir>/config/jest/cssTransform.js",
      "^(?!.*\\.(js|jsx|mjs|css|json)$)": "<rootDir>/config/jest/fileTransform.js"
    },
    "transformIgnorePatterns": [
      "[/\\\\]node_modules[/\\\\].+\\.(js|jsx|mjs)$"
    ],
    "moduleDirectories": [
        "node_modules",
        "src"
    ],
    "moduleNameMapper": {
      "^react-native$": "react-native-web"
    },
    "moduleFileExtensions": [
      "web.js",
      "js",
      "json",
      "web.jsx",
      "jsx",
      "node",
      "mjs"
    ]
  },

My tests that run files that only contain relative paths in the tree run correctly.

To Clarify, I'm looking for how to configure Jest to not fail on absolute paths.

3
  • try import AppContainer from './src/views/app'; Commented Jun 14, 2018 at 17:59
  • 12
    I need to know how to run absolute paths so I don't have to back step multiple directories on imports or update as many files if I move files Commented Jun 14, 2018 at 18:03
  • Important to mention that here the jest config is in the package.json. But I could also be on a jest.config.json or other file. Commented Jun 23, 2023 at 20:12

16 Answers 16

123

I think you're looking for: roots or modulePaths and moduleDirectories

You can add both relative and absolute paths.

I would make sure to include <rootDir> in the roots array, <rootDir> in the modulePaths array, and node_modules in the moduleDirectories array, unless you've got a good reason to exclude them.

"jest": {
  "roots": [
    "<rootDir>",
    "/home/some/path/"
  ],
  "modulePaths": [
    "<rootDir>",
    "/home/some/other/path"
  ],
  "moduleDirectories": [
    "node_modules"
  ],
}
Sign up to request clarification or add additional context in comments.

6 Comments

This helped me solved my issue in Angular. My error was Cannot find module 'src/app/core/services/seo.service' from 'src/app/blog/blog-list/blog-list.component.ts' and it happened after importing routerTestingModule in my spec file which was to solve an error of NG0304: 'router-outlet' is not a known element: In my jest.config.js ` module.exports = { preset: "jest-preset-angular", setupFilesAfterEnv: ["<rootDir>/setup-jest.ts"], globalSetup: "jest-preset-angular/global-setup", modulePaths: ["<rootDir>"], // <-- adding this solved it };`
"modulePaths": ["<rootDir>/src/"] was what I needed.
"modulePaths": [ "<rootDir>/../" ] was it in may case :=)
This doesn't work with Create React App. We must eject first to run this :/
moduleDirectories can be omitted as the default for it is already ["node_modules"]
|
78

In package.json you have the below lines of Jest configuration:

"moduleDirectories": [
    "node_modules",
    "src"
]

These says that each module you import will be searched for first in node_modules, then in src.

Since the code is already looking in the src/, you should use:

import AppContainer from 'views/app';

Please note that this path is absolute to the src directory, you do not have to navigate to locate it as relative path.

Or you can configure your root directory in moduleDirectories inside your Jest configuration (in your case, within package.json) so that all your components could be easily found.

1 Comment

In my case, moduleNameMapper was the way to go, considering we had @ pointing to some specific root directories.
25

Adding

"moduleDirectories": [
    "node_modules",
    "src"
]

should work if you have Jest's config in your package.json file.

If you have a jest.config.js file, you should add it there, otherwise package.json will be overriden (and ignored) by this config file. So in your jest.config.js file:

module.exports = {
// ... lots of props
  moduleDirectories: ["node_modules", "src"],
// ...
}

Comments

10

That's because jest doesn't recognize relative imports like src/views/app

Add a rootDir and a modulePaths in package.json

"name": "my-app",
...
"jest": {
    ...
    "rootDir": "./",
    "modulePaths": [
      "<rootDir>"
    ],
    ...
  }
}

1 Comment

The problem I was facing was the imports inside another imported file. Using it for nestJs. The actual test files are in a folder called tests and the actual code is in src. The above with slight modification seems to be working for me "modulePaths": [ "<rootDir>/../" ],
9

In my case, I was running integration tests and all tests were in the same file with the path src/int-test.spec.ts in order to read paths I had to write:

Solution 1

"jest": {
    ...,
    "moduleNameMapper": {
      "src/(.*)": "<rootDir>/$1"
    }
  }

Another way of doing this is to create jest.config.js file, The file will be discovered automatically, if it is named jest.config.js|ts|mjs|cjs|json. And put this into it:

Solution 2

const path = require('path');

module.exports = {
  moduleFileExtensions: ['js', 'json', 'ts'],
  roots: ['src'],
  testRegex: '.*\\.spec\\.ts$',
  transform: {
    '^.+\\.(t|j)s$': 'ts-jest',
  },
  collectCoverageFrom: ['**/*.(t|j)s'],
  coverageDirectory: '../coverage',
  testEnvironment: 'node',
  moduleDirectories: ['node_modules', 'src', __dirname],
};

1 Comment

Additionally, if you're experiencing this issue with prefixed imports (like parcel likes to use), you can change the mapper to: "prefix:(.*)": "$1" and then mock the path without the prefix if needed.
5

Make sure you have run npm i or npm install after update the package.json. My issue was that :0

Comments

3

For those who are building something from scratch with Webpack and Babbel. Try the following steps:

  1. Delete the node_modules folder and install again. (This was something that solved my issue).

  2. Here is a link with the necessary documentation to set up Webpack which in some cases will not be necessary. Jest Docs Webpack

  3. Here is a link to the docs that explains how to set up Jest with React (Without using Create-React-App). Jest React Docs

4. Here is an example with a simple setup with Jest. You can set this up in package.json or the Jest configuration file.

Disclaimer: This does not answer the OP question. But most people will end up here for the keywords used for this issue.

  "jest": {
"moduleFileExtensions": ["js", "jsx"],
"moduleDirectories": ["node_modules"],
"moduleNameMapper": {
  "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js",
  "\\.(css|less)$": "<rootDir>/__mocks__/styleMock.js"
}

},

Comments

3

One of the modules I wanted to use has a .cjs extension. Adding .cjs to moduleFileExtensions in jest.config.js fixed this problem for me.

My jest.config.js as example:

module.exports = {
    moduleNameMapper: {
        // see: https://github.com/kulshekhar/ts-jest/issues/414#issuecomment-517944368
        "^@/(.*)$": "<rootDir>/src/$1",
    },
    preset: "ts-jest/presets/default-esm",
    globals: {
        "ts-jest": {
            useESM: true,
        },
    },
    testEnvironment: 'jsdom',
    transform: {
        '^.+\\.vue$': 'vue3-jest',
    },
    moduleFileExtensions: ['json', 'js', 'jsx', 'ts', 'tsx', 'vue', "cjs"],
    moduleDirectories: ["node_modules"],
};

Comments

3

Just add "modulePaths" to your package.json

"jest": {
    ...
    "modulePaths": [
      "<rootDir>"
    ],
    ...
  }
}

Comments

3

Try to add this to jest config

"modulePaths": [
  "<rootDir>"
]

Comments

2

Adding __esModule:true fixed this issue for me.

jest.mock('module',()=>({
  __esModule: true,                    // this makes it work
  default: jest.fn()
}));

Hope this helps somebody. Although this is not very specific to the question.

Comments

1

This can also be caused by absolute imports present in the globalSetup file (or any files it references).

It seems like moduleNameMappers do not get applied to globalSetup files. I fixed this by just switching to relative imports for those specific files.

Comments

1

This Workaround:

Using "moduleNameMapper" in your jest configuration will make test-resolve work as expected:

"jest": {
  "moduleNameMapper": {
    "#(.*)": "<rootDir>/node_modules/$1"
  }
}

https://gist.github.com/lydell/d62ce96c95c035811133a5396195da14

1 Comment

Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.
1

I also faced the same issue using Angular@15 and Jest@29. Following are the two fixes that worked for me.

  1. Converting absolute path to relative path (not a scalable solution if you have a large codebase)
    Absolute path - import SharedService from 'src/app/services/shared/shared.service';
    Relative path - import SharedService from '../../services/shared/shared.service';

  2. Add the following in your jest configuration (jest.config.ts)

module.exports = {
 ...,
 ...,
 moduleDirectories: ['node_modules', '<rootDir>'],
}

Comments

0

I had jest-expo installed, but not jest. Probably related that I'm prebuild-ejected from Expo. I had to run yarn add jest-expo jest to install jest, and updated jest-expo. Now my tests run.

Depending on your setup it might be, npm i jest-expo jest or expo install jest-expo jest. ... Got the idea from their docs https://docs.expo.dev/guides/testing-with-jest/

Comments

0

This solved it for me.

Here is my jest-e2e.json file:

{
    "moduleFileExtensions": ["js", "json", "ts"],
    "rootDir": "..",
    "globalSetup": "<rootDir>/src/integration-test/setup.ts",
    "globalTeardown": "<rootDir>/src/integration-test/teardown.ts",
    "testEnvironment": "node",
    "testRegex": ".e2e-spec.ts$",
    "transform": {
        "^.+\\.(t|j)s$": "ts-jest"
    },
    "moduleDirectories": ["<rootDir>", "node_modules"],
    "moduleNameMapper": {
        "^src/(.*)$": "<rootDir>/src/$1"
    },
    "testPathIgnorePatterns": [".*\\.e2e\\.ts$"],
    "collectCoverageFrom": ["src/**/*.ts", "!src/private/**/*.resolver.ts"],
    "coveragePathIgnorePatterns": [
        ".*\\.module\\.ts$",
        ".*\\.entity\\.ts$",
        ".*\\.dto\\.ts$",
        ".*\\.interface\\.ts$",
        ".*\\.input\\.ts$",
        ".*\\.config\\.(t|j)s$",
        ".*\\.js$",
        "/dist/",
        "/coverage/",
        "/node_modules/"
    ],
    "coverageDirectory": "./coverage",
    "transformIgnorePatterns": ["node_modules/(?!(node-fetch)/)"]
}

You can see I call "setup.ts" in there. Then I added "tsconfig-paths/register" like this in my setup.ts file:

require("tsconfig-paths/register") <---- ADDED THIS

import { integrationTestEnvSetup } from "./env-setup"
import { integrationTestSetupStuff } from "./setup-stuff"

/* Code run prior to integration test from ./jest-e2e.json */

const integrationTestSetup = async () => {
    await integrationTestEnvSetup()
    await integrationTestSetupStuff()
}

export default integrationTestSetup

Make sure you have the tsconfig-paths package installed for this as well.

The require("tsconfig-paths/register") line is used to import the tsconfig-paths package, which is a utility that allows Node.js to understand TypeScript's paths and baseUrl options directly. This is often used in conjunction with a tool like ts-node for running TypeScript code directly in Node.js without a separate compilation step.

Hope that can help anyone else! I was so happy when I realized that this worked, after hours of hair-pulling.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.