node.js - Jest kan inte hitta modul med relativ sökväg på Docker


Jag vet att det finns några trådar om ett liknande ämne men har försökt olika föreslagna lösningar och ingen fungerade.

Problemet: När jag körde jest-tester skrivna i TS på Docker som en del av en Jenkins-pipeline fick jag: Cannot find module '../../../common/src/SomeType' från 'dist/src/services/foo.services.js', där foo.services.js är det som testas.

Detta är min projektstruktur; vet inte varför det ursprungligen var strukturerat så här. Jag gick med i festen alldeles för sent.

MyProject123
    client
       package.json
       tsconfig.json
       ...
    common
       tsconfig.json
       src
         SomeType.ts  (NOTE: this is what can't be found by jest!)
         Others.ts
    server
       dist
       src
          foo.services.ts (NOTE: this is what being tested)
       tests
          unit
            services
               foo.services.spec.ts (NOTE: this is the test!)
       tsconfig.json
       jest.conf.js

Inuti foo.services.ts refererar det till SomeType som:

import { SomeType } from '../../../common/src/SomeType';

Inuti server/tsconfig.json satte den references för att referera till den gemensamma mappen:

"references": [
    {
      "path": "../common"
    }
  ],
  "include": [
    "src/**/*.ts",
    "*.ts",
    "src/**/*.json",
    "tests/**/*.ts"
    ],

I jest.conf.js under server-mappen finns det:

moduleNameMapper: {
        '^@/(.*)$': '<rootDir>/src/$1'
    },`

Inuti server/package.json står det:

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

Det märkliga är att alla tester fungerar bra lokalt på min dator. Men det fungerar inte när det körs i docker.

Gissar att jag saknar någon jest-konfigurationsinställning någonstans?

----------------------------REDIGERA 1 --------------------------- Här är vår dockerfile som är relevant för delen:

FROM company.com/nodejs:16
ARG BUILD_MODE
USER root

ARG http_proxy=******
ARG https_proxy=$http_proxy
ARG no_proxy=******
ARG CI=true
ARG NPM_CONFIG__AUTH

WORKDIR /app
COPY . .

RUN npm cache clean --force

RUN npm install npm -g
WORKDIR /app/server
COPY server/package.json .
COPY server/package-lock.json .
COPY server/.npmrc .
RUN npm ci --loglevel verbose
RUN npm run build-ts
RUN rm -rf tests/coverage
RUN npm run test:unit //NOTE: runs the server unit tests

Svar #1

Från det fel du har

Cannot find module '../../../common/src/SomeType' from 'dist/src/services/foo.services.js'

ser ut som att du kör Jest på dina bundle-filer. (från dist/...)

Som en påminnelse kör Jest på källfiler, inte på bundlade filer.

En snabb lösning skulle vara att köra ditt testsuite innan du paketerar din app i din dockerfil:

...
RUN npm run test:unit
RUN npm run build-ts