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
