javascript - ts-jest kan inte lösa tsconfig-alias


Jag har ett TypeScript-projekt och jag har ställt in alias i ts.config.json

{
  "compilerOptions": {    
    "paths": {   
      "@pkg/*": ["./packages/*"],
        },
  }
}

i mina ts-filer kan jag förkorta mina importvägar

// example.ts
import {someThing} from '@pkg/mypackage'

det fungerar bra med tsc och vscode kan känna igen aliasvägen korrekt, men när jag kör npm t som kör jest misslyckas det

Cannot find module '@pkg/mypackage' from 'example.ts'

jest.config.js

module.exports = {
  preset: "ts-jest",
  testEnvironment: "node",
  transform: {
    "^.+\\.tsx?$": "ts-jest",
  },
};

Jag lade till detta i min package.json-fil

"jest": {
    "moduleNameMapper": {
      "@pkg/(.*)": "<rootDir>/packages/$1"
    }
  }

Jag lyckades använda pathsToModuleNameMapper, men jag hade detta problem https://github.com/kulshekhar/ts-jest/issues/2709

Svar #1

Jag hade samma problem, men lyckades få det att fungera genom att använda ett par plugins. Jag har också några extra matchers i slutet för några ytterligare testtyper.

Min Jest-base.config.js har tsconfig-paths-jest-pluginet installerat och igång. Detta plugin löste mina tsconfig-vägproblem.

Jag använder en vanlig basfil för gemensam konfiguration mellan enhetstester och end-to-end-tester, som jag båda kör via Jest för närvarande.

jest-bas-konfig.ts

const tsconfig = require('./tsconfig.json');
const moduleNameMapper = require('tsconfig-paths-jest')(tsconfig);

module.exports = {
    moduleNameMapper,
    preset: 'ts-jest',
    testEnvironment: 'node',

    rootDir: './',

    collectCoverage: true,
    collectCoverageFrom: [
        '<rootDir>/**/*.ts',
        '!<rootDir>/**/*.interface.ts',
        '!<rootDir>/**/*.mock.ts',
        '!<rootDir>/**/*.module.ts',
        '!<rootDir>/**/__mock__/*',
        '!<rootDir>/src/main.ts'
    ],
    coverageProvider: 'v8',
    coverageReporters: [
        'clover',
        'json',
        'lcov',
        'text',
        'text-summary'
    ],
    resetModules: true,
    setupFiles: [
        'dotenv/config'
    ],
    // Add the community jest-extended matchers
    setupFilesAfterEnv: [
        'jest-extended'
    ],
    verbose: false
};

Min jest.config.js (för enhetstester) kommer att utöka min jest-base.config.js för att lägga till enhetstest-specifik kod såsom krav på täckning, var output för täckning ska lagras osv.

jest.config.js

const JestBaseConfiguration = require('./jest-base.config');

module.exports = Object.assign(JestBaseConfiguration, {
moduleFileExtensions: ['js', 'json', 'ts'],
testRegex: '.e2e-spec.ts$',
transform: {
    '^.+\\.(t|j)s$': 'ts-jest'
},
...

Svar #2

Jag löste detta problem genom att lägga till en moduleNameMapper-egenskap i filen jest.config.ts.

ts.config.json:

"paths": {
        "@/*": ["src/*"],
        "@": ["src/index.ts"]
    },

jest.config.json:

import type { Config } from "jest";

const config: Config = {
    preset: "ts-jest",
    testEnvironment: "node",
    moduleNameMapper: {
        "@/(.*)": "<rootDir>/src/$1",
    },
};

export default config;

Relaterade artiklar