Пути машинописного текста не разрешаются при запуске jest?

Попытка преобразовать этот проект в шутку, используя эти инструкции. У меня все работает, кроме файлов, которые используют paths конфигурация:

"paths": {
      "@fs/*": ["./src/*"], 
      "@test/*": ["./test/*"]
    }

Похоже, что при выполнении тестов операторы импорта не разрешаются, и это записывается в журнал:

Cannot find module '@fs/container/validation/ValidationContext' from 'Core.spec.ts'

  1 | import { ValidationOptions } from "@fs/container/validation/ValidationOptions";
> 2 | import { ValidationContext } from "@fs/container/validation/ValidationContext";
    | ^
  3 | import { ValidationContainer } from "@fs/container/validation/ValidationContainer";
  4 | 
  5 | import { Core1 } from "@test/core/Core1";

  at Resolver.resolveModule (node_modules/jest-resolve/build/index.js:221:17)
  at Object.<anonymous> (test/core/Core.spec.ts:2:1)

Есть ли способ получить Jest/ TS-JEST включить @paths при разрешении импорта?

4 ответа

Решение

jest не может учитывать отображение пути tsconfig, так как это время компилятора ts, поэтому в конфигурации jest должен быть соответствующий модуль modulenamemapper ( https://jestjs.io/docs/en/configuration.html) для разрешения альтернативных путей,

Я хотел разрешить пути к модулям, начиная с ~/ к моему <baseUrl>/<moduleName>.

Благодаря ссылке OJ Kwon я решил это (дайте ему точку).

tsconfig.json

см. документ о сопоставлении путей с разрешением модуля

      {
  "compilerOptions": {
    "baseUrl": "src",
    "paths": {
      "~/*": ["*"]
    }
  },
}

Конфигурация шутки

Тогда нам нужно сказать jestчтобы разрешить пути тоже. Это делается со следующей конфигурацией:

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

Добавьте jest.config.js в корневую папку проекта с содержимым ниже.

      const { pathsToModuleNameMapper } = require('ts-jest/utils')
const { compilerOptions } = require('./tsconfig')
module.exports = {
    preset: 'ts-jest',
    testEnvironment: 'node',
    moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths),
    modulePaths: [
        '<rootDir>'
    ],
}

Ответ @FranSanchis действительно решил проблему для меня, я только что внес много изменений, чтобы соответствовать изменениям шутки 2023 года.

в jest.config.js

      const { pathsToModuleNameMapper } = require('ts-jest');
const { compilerOptions } = require('./tsconfig');

module.exports = {
  
  preset: 'ts-jest',
.
.
.
moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths),
  modulePaths: ['<rootDir>'],
}

И в тсконфиге

      "compilerOptions": {
    "target": "es6",
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve",
    "incremental": true,
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    }
Другие вопросы по тегам