Jest дает "Не удается найти модуль" при импорте компонентов с абсолютными путями

Получение следующей ошибки при запуске 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"
    ]
  },

Мои тесты, которые запускают файлы, содержащие только относительные пути в дереве, работают правильно.

Чтобы уточнить, я ищу, как настроить Jest, чтобы не сбой по абсолютным путям.

Ответ 1

Так как в package.json вас есть:

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

Это говорит о том, что каждый импортируемый вами модуль будет сначала просматриваться в node_modules а если он не найден, будет просматриваться в каталоге src.

Поскольку он смотрит в каталог src вы должны использовать:

import AppContainer from 'views/app';

Обратите внимание, что этот путь является абсолютным для каталога src, вам не нужно перемещаться, чтобы найти его как относительный путь.

ИЛИ вы можете настроить корневой каталог в moduleDirectories внутри вашего pakcage.json, чтобы все ваши компоненты могли быть импортированы так, как вы этого хотите.

Ответ 2

Я думаю, что вы ищете: корни или modulePaths и moduleDirectories

Вы можете добавить как относительные, так и абсолютные пути.

Я бы обязательно включил <rootDir> в массив <rootDir>, <rootDir> в массив node_modules и node_modules в массив moduleDirectories, если у вас нет веских причин для их исключения.

"jest": {
  "roots": [
    "<rootDir>",
    "/home/some/path/"
  ],
  "modulePaths": [
    "<rootDir>",
    "/home/some/other/path"
  ],
  "moduleDirectories": [
    "node_modules"
  ],
}