reactjs - Jest følger ikke filer i en symlink-mappe og prøver å bruke hovedmappen for deling


Spørsmålet er - hvordan tvinge Jest til å følge symlinkede delte mappestrukturer, men ikke hovedmappen?

Jeg har den neste filstrukturen:

root
├── projects
│   ├── A
│   │   ├── node_modules
│   │   ├── shared (symlink ../../shared-main)
│   │   ├── components
│   │   ├── settings.ts
│   ├── B
│   │   ├── node_modules
│   │   ├── shared (symlink ../../shared-main)
│   │   ├── components
│   │   ├── settings.ts
├── shared-main
│   ├── utils.ts
│   ├── config.ts

I mine prosjekter, A og B, bruker jeg utils fra den delte mappen. Utils.ts bruker config.ts hvor den importerer innstillingsfiler med banen './settings.ts', men inne i shared-main-mappen ser det ut som om "filen finnes ikke" (det er ok). Men Jest i et prosjekts tester, når det møter bruk av en delt fil, feiler testen med feilen: "../../shared-main/config.ts:9:35 - error TS2307: Cannot find module '../settings' or its corresponding type declarations."

Hvordan komme seg rundt dette og tvinge Jest til å bruke config.ts fra symlinken-mappen i stedet for hovedmappen?

Svar #1

Hva med "testRegex": ["test/.*.[jt]s"], i din jest-konfigurasjon slik at den ikke prøver å finne delte filer? Hvis du bruker delte filer på tvers av flere prosjekter, bør ikke ett enkelt prosjekt teste disse filene; de bør kun teste sine egne filer.

Jeg er imidlertid ikke så sikker på at symlinker er problemet ditt; når du bruker TypeScript på denne måten og prøver å bruke filer utenfor prosjektets rootDir, vil det ikke finne typene for dem, eller det vil klage på at det ikke finner typene hvis du har lagt dem til i tsconfig include/exclude. Akkurat nå kan jeg bare anta at du bruker tsc --project med spesifikke konfigurasjonsfiler for hvert prosjekt.

// tsconfig.json

"include": ["projectA/**/*.ts"],

Hvis du har gjort noe slikt, vil det ikke finne noen typer utenfor projectA, så alt i config.ts og utils.ts vil ikke ha noen typer eller kunne finne noen moduler, med mindre de er inkludert i din tsconfig.

For å vise et enklere eksempel hvis jeg har:

// tsconfig.json

...
includes: ["src/**/*.ts"]
...

Sammen med en katalogstruktur som dette:

- tsconfig.json
- example.ts
- src

Da vil ingenting i example.ts kunne finne typene eller modulimportene sine.

Måten jeg omgår dette problemet i prosjektet mitt på, er å bruke ts-jest sammen med å spesifisere hvor man finner tester, i tillegg til å overstyre globals rootDir.

// .jestrc.json

"testRegex": ["test/.*.[jt]s"],

...

"globals": {
  "ts-jest": {
    "tsconfig": {
      "rootDir": "."
    }
  }
}