javascript - `moduleNameMapper`-Einstellungen in jest.config.js funktionieren auf CircleCI nicht
Ich habe mit meiner React-App in TypeScript getestet, wobei ich ts-jest wie unten verwendet habe.
import * as React from "react";
import * as renderer from "react-test-renderer";
import { ChartTitle } from "Components/chart_title";
describe("Component: ChartTitle", () => {
it("will be rendered with no error", () => {
const chartTitle = "My Chart 1";
renderer.create(<ChartTitle title={chartTitle} />);
});
});
und es hat in meiner lokalen Umgebung bestanden, aber in CircleCI versagt.
FAIL __tests__/components/chart_title.tsx
● Test suite failed to run
TypeScript diagnostics (customize using `[jest-config].globals.ts-jest.diagnostics` option):
__tests__/components/chart_title.tsx:4:28 - error TS2307: Cannot find module 'Components/chart_title'.
4 import { ChartTitle } from "Components/chart_title";
~~~~~~~~~~~~~~~~~~~~~~~~
Dieses Components/ ist ein Alias-Ausdruck durch moduleNameMapper, und ich denke, es funktioniert nur in CircleCI nicht.
Die Option jest --showConfig sagt mir, dass es keinen Unterschied zwischen der lokalen und der CI-Umgebung gibt.
Gibt es einen Fehler in meinen Einstellungen?
app/frontend/jest.config.js
module.exports = {
globals: {
"ts-jest": {
tsConfig: "tsconfig.json",
diagnostics: true
},
NODE_ENV: "test"
},
moduleNameMapper: {
"^Components/(.+)$": "<rootDir>/src/components/$1"
},
moduleDirectories: ["node_modules", 'src'],
moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json"],
transform: {
"^.+\\.tsx?$": "ts-jest"
},
verbose: true
};
app/frontend/tsconfig.json
{
"compilerOptions": {
"baseUrl": "src",
"outDir": "dist",
"allowJs": true,
"checkJs": true,
"moduleResolution": "node",
"sourceMap": true,
"noImplicitAny": true,
"target": "esnext",
"module": "commonjs",
"lib": ["es6", "dom"],
"jsx": "react",
"strict": false,
"removeComments": true,
"types": ["jest"]
},
"typeRoots": ["node_modules/@types"],
"paths": {
"Components/*": ["src/components/*"]
},
"include": ["src/**/*"],
"exclude": ["node_modules", "__tests__"]
}
app/frontend/package.json
{
"scripts": {
"build": "webpack --mode development --watch",
"build-production": "node_modules/.bin/webpack --mode production",
"test": "jest",
"lint": "npx eslint src/**/* __tests__/**/* --ext \".ts, .tsx\"",
},
}
app/.circleci/.config.yml
version: 2
jobs:
build:
...
steps:
- run:
name: run tests for frontend
command: npm test -- -u
working_directory: frontend
Antwort #1
tsconfig-paths-jest ist in Jest >23 nicht verwendbar. Für das aktuelle Jest 26 habe ich es zum Laufen gebracht über: https://kulshekhar.github.io/ts-jest/docs/getting-started/paths-mapping/
jest.config.jsconst { pathsToModuleNameMapper } = require('ts-jest');
const { compilerOptions } = require('./tsconfig');
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths, { prefix: '<rootDir>/src/' } )
};
tsconfig.json "compilerOptions"
"baseUrl": "./src",
"paths": {
"@models/*": [ "./models/*" ],
"@inputs/*": [ "./inputs/*" ],
"@tests/*": [ "./__tests__/*" ],
"@resolvers/*": [ "./resolvers/*" ],
"@seeds/*": [ "./seeds/*" ],
"@index": [ "./index.ts" ],
"@ormconfig":[ "../ormconfig.ts" ]
},
Antwort #2
Ich habe endlich seine Lösung herausgefunden.
Laut diesem Problem verwende ich tsconfig-paths und tsconfig-paths-jest.
Also haben sich meine Einstellungsdateien wie unten geändert.
tsconfig.json
{
"compilerOptions": {
"baseUrl": ".",
"outDir": "dist/",
"allowJs": true,
"checkJs": true,
"moduleResolution": "node",
"sourceMap": true,
"noImplicitAny": true,
"target": "es6",
"module": "commonjs",
"lib": ["es5", "es6", "dom"],
"jsx": "react",
"strict": false,
"removeComments": true,
"types": ["node", "jest"],
"paths": {
"Components/*": ["src/components/*"]
}
},
"typeRoots": ["node_modules/@types"],
"include": ["src/**/*"],
"exclude": ["node_modules", "__tests__"]
}
jest.config.js
/* eslint-disable import/order */
/* eslint-disable @typescript-eslint/no-var-requires */
const tsconfig = require("./tsconfig.json");
const moduleNameMapper = require("tsconfig-paths-jest")(tsconfig);
module.exports = {
globals: {
"ts-jest": {
tsConfig: "tsconfig.json",
diagnostics: true
},
NODE_ENV: "test"
},
setupFilesAfterEnv: [`${__dirname}/src/setupTests.ts`],
moduleDirectories: ["node_modules", 'src'],
moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json"],
transform: {
"^.+\\.tsx?$": "ts-jest"
},
verbose: true,
moduleNameMapper
};
Und meine Tests haben in CircleCI gut funktioniert, aber ich habe immer noch keine Ahnung, warum diese Tests vorher lokal mit dieser Lösung funktioniert hatten.
