Hopp til hovedinnhold
Versjon: Neste

Fra v29 til v30

Unofficial Beta Translation

This page was AI-translated by PageTurner (beta). Not officially endorsed by the project. Found an error? Report issue →

Oppgraderer du Jest fra v29 til v30? Denne guiden vil hjelpe deg med å refaktorere konfigurasjonen og testene dine.

info

Se endringsloggen for fullstendig liste over endringer.

notat

Oppgraderer du fra en eldre versjon? Du finner oppgraderingsguiden fra v28 til v29 her.

Kompatibilitet

  • Jest 30 støtter ikke lenger Node 14, 16, 19 eller 21. Minimumsversjonene for Node er nå 18.x. Sørg for at miljøet ditt bruker en kompatibel Node-versjon før oppgradering.

  • Minimumsversjonen for TypeScript er nå 5.4. Oppdater TypeScript hvis du bruker typedefinisjoner for Jest (eller noen av pakkene).

  • jest-environment-jsdom-pakken bruker nå JSDOM v26. Denne oppdateringen kan føre til endringer i DOM-miljøet. Hvis du oppdager forskjellig oppførsel eller nye advarsler i DOM-en, se JSDOMs utgivelsesnotater for v21–26.

Jest Expect & Matchers

Fjernede alias for matcher-funksjoner

Alle alias-navn for matchere er fjernet til fordel for hovednavnene. Hvis du har brukt eldre, avskrevne matcher-navn, må du oppdatere testene dine:

  • Fjernede alias og deres erstatninger:
    • expect(fn).toBeCalled() expect(fn).toHaveBeenCalled()
    • expect(fn).toBeCalledTimes(n) expect(fn).toHaveBeenCalledTimes(n)
    • expect(fn).toBeCalledWith(arg) expect(fn).toHaveBeenCalledWith(arg)
    • expect(fn).lastCalledWith(arg) expect(fn).toHaveBeenLastCalledWith(arg)
    • expect(fn).nthCalledWith(n, arg) expect(fn).toHaveBeenNthCalledWith(n, arg)
    • expect(fn).toReturn() expect(fn).toHaveReturned()
    • expect(fn).toReturnTimes(n) expect(fn).toHaveReturnedTimes(n)
    • expect(fn).toReturnWith(val) expect(fn).toHaveReturnedWith(val)
    • expect(fn).lastReturnedWith(val) expect(fn).toHaveLastReturnedWith(val)
    • expect(fn).nthReturnedWith(n, val) expect(fn).toHaveNthReturnedWith(n, val)
    • expect(func).toThrowError(message) expect(func).toThrow(message)
info

Disse alias-metodene var avskrevet siden Jest 26, og i Jest 30 er de fullstendig fjernet. Utfør et globalt søk-og-erstatt i kodebasen din for å oppdatere til de kanoniske matcher-navnene. Funksjonaliteten er identisk – kun metodennavnene er endret. (Hvis du bruker ESLint med eslint-plugin-jest, kan regelen no-alias-methods automatisere denne erstatningen.)

Ikke-nummererbare egenskaper

Ikke-nummererbare objektegenskaper ekskluderes nå som standard fra objektmatchere. Dette kan påvirke expect.objectContaining eller likhetssjekker.

Forbedret typeinferens for CalledWith

TypeScript-brukere: Typene for CalledWith-matcherefamilien (f.eks. toHaveBeenCalledWith) er forbedret for å inferere funksjonsparametertyper. I de fleste tilfeller vil dette fange typemismatcher mer nøyaktig. Dette er en kompilerings-tids brytende endring.

Hvis du har sjekket kall med argumenter som ikke samsvarer med funksjonens parameter-typer, kan TypeScript nå gi feil på disse testene. For eksempel, hvis en funksjon er typet til å akseptere et tall og du skrev expect(fn).toHaveBeenCalledWith("string"), vil TypeScript 5 + Jest 30 sine typer markere dette. Kjøretidsadferden til matcheren er uendret.

For å fikse nye TypeScript-feil, sørg for at testargumentene dine samsvarer med funksjonens forventede typer (eller bruk typeomforming hvis du med vilje kaller med andre typer).

Denne endringen påvirker ikke kjøretid, men den kan avdekke nye typefeil i testene dine som tidligere ikke ble lagt merke til, noe som gjør testene dine mer typesikre.

Konfigurasjonsoppdateringer

Støtte for .mts og .cts filendelser

Jest 30 utvider støtten for ESM- og TypeScript-modulfilendelser:

  • Standard moduleFileExtensions inkluderer nå .mts og .cts (TypeScript ESM og CommonJS-moduler) i tillegg til vanlige endelser.

  • Standard testMatch og testRegex-mønstre er oppdatert til å gjenkjenne .mjs, .cjs, .mts og .cts filer som testfiler.

info

Hvis prosjektet ditt inneholder filer med disse endelsene som ikke skal behandles som moduler eller tester, kan det hende du må justere konfigurasjonen. Omvendt, hvis du har testfiler med disse endelsene, vil Jest nå oppdage dem som standard (du kan fjerne tilpasset konfigurasjon som tidligere var nødvendig for å inkludere dem).

--testPathPattern ble omdøpt til --testPathPatterns

Hvis du filtrerer tester etter sti, merk at CLI-flagget er endret: --testPathPattern er nå --testPathPatterns. Du kan sende flere mønstre ved å skille dem med mellomrom eller gjenta flagget. For eksempel:

# Old (Jest 29)
jest --testPathPattern="unit/.*"

# New (Jest 30)
jest --testPathPatterns "unit/.*" "integration/.*"

Internt konsoliderer Jest disse mønstrene til et TestPathPatterns-objekt. Hvis du programmatisk kalte Jest sin watch-modus med testPathPattern, må du nå konstruere en TestPathPatterns-instans i stedet.

Fjernet --init-kommando

Den interaktive konfigurasjonsinitialiseringskommandoen jest --init er fjernet. Denne foreldede kommandoen ble brukt til å sette opp en Jest-konfigurasjonsfil. Hvis du trenger å opprette en konfigurasjon, kan du kjøre:

npm init jest@latest
# Or for Yarn
yarn create jest
# Or for pnpm
pnpm create jest

Andre CLI-endringer

  • Jest validerer nå CLI-flagg som krever argumenter for å sikre at et argument er gitt. For eksempel, hvis du bruker --maxWorkers eller --selectProjects, må du inkludere en verdi (f.eks. --maxWorkers=50%). Tidligere kunne Jest tillate visse flagg uten verdi (med standardverdier som fallback); nå vil det gi feil hvis verdien mangler. Sikre at skript eller npm-kommandoer som sender Jest-flagg inkluderer nødvendige argumenter.

  • Hvis du bruker --filter-alternativet for å filtrere testfiler (en avansert brukssak der du angir sti til en filterimplementering), har forventet grensesnitt endret seg. Filterfunksjonen bør nå returnere et objekt med formen {filtered: Array<string>}, som samsvarer med dokumentert format. I tidligere versjoner kunne et annet returformat bli akseptert (f.eks. å returnere en array direkte). Oppdater tilpassede testfilterfunksjoner til å returnere et objekt med filtered-egenskap som dokumentert.

Testkjøratferdsendringer

Uhåndterte promiserejeksjoner i tester

Jest inkluderer en fiks for å håndtere promiser som blir avvist og senere fanget, for å unngå falske testfeil. I Jest 29 kunne en promiserejeksjon som ble håndtert asynkront (etter testticken) fortsatt føre til feil testfeil. Jest 30 venter nå en ekstra hendelsessyklus for å bekrefte at en promiserejeksjon forblir uhåndtert før den feiler en test.

info

Du bør oppfå færre falske positive for ubehandlede promiserefusjoner. Tester som tidligere feilet på grunn av asynkron behandling av avslag bør nå passere. Denne endringen kan imidlertid medføre litt lavere testutførelseshastighet, spesielt i tester som med vilje avviser promiser. For å dempe ytelsespåvirkningen er en ny konfigurasjonsflagg waitForUnhandledRejections introdusert. Dette flagget, når deaktivert, kan gjenopprette tidligere oppførsel (uten venting) om absolutt nødvendig. De fleste brukere trenger ikke endre dette – standardinnstillingen favoriserer nå korrekthet ved å forhindre falske feil.

Egendefinerte testsekvenser

Hvis du bruker egendefinert testsekvenser (en klasse som arver fra Jest sin TestSequencer), må du oppdatere den for Jest 30. Jest sender nå tilleggskontekst til testsekvenseren. Spesifikt ble TestSequencer-APIet utvidet for å eksponere globalConfig og contexts i din sekvenserer.

Påkrevet globalConfig i Runtime

For de som bruker Jest sine programmerings-APIer: konstruksjon av Runtime krever nå en globalConfig-parameter. Hvis du bruker jest.runCLI eller lignende verktøy, sørg for at du sender alle nødvendige alternativer i henhold til oppdatert API. (Vanlig jest CLI eller npm test bruk påvirkes ikke av denne endringen.)

Snapshot og utdataendringer

Oppdatert ødelagt dokumentasjonslenke

Foreldet goo.gl URL er fjernet fra snapshot-tester. Denne endringen oppdaterer eksisterende snapshots til å erstatte goo.gl-lenker med fulle, uforkortede URL-er.

Feilårsaker i Snapshots

Feilserialisering i snapshots er endret. Jest 30 sin snapshot-serializer vil nå inkludere en cause-egenskap (hvis tilstede) for Error ved utskrift av feil.

React tom streng gjengivelse

React-spesifikk snapshot-serializer gjengir ikke lenger tomme strengbarn ("") i utdataene. I Jest 29 kunne et tomt strengbarn i et React-element vises som "" i snapshot-utdata; i Jest 30 utelates det (behandles som intet innhold).

Forbedret objektutskrift i pretty-format

ArrayBuffer og DataView skrives nå i menneskelesbar form i stedet for som objekter med interne felt.

Jest Mock API-endringer

jest.genMockFromModule fjernet

Den foreldede funksjonen jest.genMockFromModule(moduleName) er fjernet. Den var tidligere avviklet til fordel for jest.createMockFromModule(moduleName). Hvis du fortsatt bruker genMockFromModule, bytt til createMockFromModule – oppførselen er identisk. For eksempel:

Gammel kode (Jest 29):

const mockFs = jest.genMockFromModule('fs');

Ny kode (Jest 30):

const mockFs = jest.createMockFromModule('fs');

Fjernede mockfunksjonstyper

info

Typeendringene gjelder kun hvis du eksplisitt importerer Jest API-er:

import {expect, jest, test} from '@jest/globals';

Noen TypeScript-typer relatert til mockfunksjoner er fjernet fra det offentlige API-et.

  • MockFunctionMetadata

  • MockFunctionMetadataType

  • SpyInstance

Hvis du brukte jest.SpyInstance (for eksempel til å annotere returverdien fra jest.spyOn), bør du oppdatere til jest.Spied.

jest.mock krever nå modulsti med riktig bruk av store og små bokstaver

jest.mock() vil fra nå av kun fungere med modulsti som følger riktig bruk av store og små bokstaver. Dette vil for de fleste være et kanttilfelle siden de fleste brukere følger operativsystemets filnavnskonvensjoner. Vi anbefaler å bruke korrekt navngitte modulstier for å unngå lignende brudd i fremtiden.

Gammel kode (Jest 29):

jest.mock('./path/to/FILENAME.js'); // This works EVEN when you only have `filename.js`

Ny kode (Jest 30):

jest.mock('./path/to/filename.js'); // This strictly works when you ONLY have `filename.js`

Modul- og runtime-endringer

ESM-modulstøtte og intern omstrukturering

Jest har introdusert betydelige underliggende endringer i hvordan pakker pakkes og eksporteres:

  • Alle interne moduler i Jest er nå bundet til enkeltfiler for raskere oppstart. Dette betyr at når du installerer Jest, er antallet filer det laster betydelig redusert (noe som forbedrer ytelsen). En bivirkning er imidlertid at uoffisielle dype importeringer til Jest-pakker sannsynligvis vil slutte å fungere. For eksempel, hvis du tidligere gjorde noe som require('jest-runner/build/testWorker') (som ikke er en offentlig API), vil denne banen ikke lenger eksistere. Løsning: Bruk kun Jests offentlige APIer eller dokumenterte grensesnitt. Hvis du er avhengig av en intern modul du mener bør være del av det offentlige API-et, vennligst åpne en Pull Request for å gjøre den tilgjengelig.

  • Jests pakker tilbyr nå ESM-omslag (ECMAScript Modules). Dette er del av pågående arbeid for å kunne kjøre Jest i en ESM-kontekst. Alle offisielle Jest-pakker eksporterer seg selv korrekt via package.json sitt "exports"-felt. For de fleste brukere har dette ingen direkte påvirkning – du fortsetter å bruke Jest på samme måte. Men hvis du vedlikeholder et verktøy eller plugin som importerer Jests moduler, må du sørge for å bruke pakkenavnene som importer (som vil bli løst via Nodes moduloppløsning).

Disse endringene regnes som bruddendringer for alle som tukler med Jests interne struktur, men ikke for typisk bruk av Jest CLI og konfigurasjon. Etter oppgradering, kjør testene dine normalt – hvis du får moduloppløsningsfeil relatert til Jests egne moduler, skyldes det sannsynligvis en ikke-støttet import som må fjernes eller oppdateres.

Endringer i Glob-mønstersammenheng

Jests avhengighet for fil-mønstersammenheng (glob) er oppgradert til v10. Glob v10 kan ha små forskjeller i mønstersyntaks og oppførsel.

En merkbar endring er at glob@10 håndterer krøllparentes-utvidelser og extglobs litt annerledes og er strengere på noen mønstre. Hvis du har egendefinerte testMatch-mønstre, moduleNameMapper-mønstre eller annen glob-basert konfigurasjon, bør de fortsatt fungere i de fleste tilfeller. Vær bare oppmerksom på at hvis et mønster ikke matcher filer som det gjorde før, kan det hende du må justere det for den nye glob-motoren.

Konklusjon

Oppgrader til Jest 30 ved først å sikre at miljøet ditt oppfyller de nye Node.js- og TypeScript-kravene. Oppdater Jest-konfigurasjonsfilen din og CLI-bruk for de omdøpte og fjernede alternativene (spesielt testPathPatterns og fjerningen av --init). Kjør testsuiten din og håndter eventuelle feil:

  • Fiks tester som bruker fjernede matcher-aliaser ved å erstatte dem med offisielle matchernavn.

  • Oppdater eventuelle øyeblikksbilder som feiler på grunn av formateringsendringer (feilårsaker, tomme strenger, etc.).

  • Vær oppmerksom på TypeScript-kompileringsfeil – de vil veilede deg til å oppdatere utdatert API-bruk (som genMockFromModule eller fjernede typer) og justere tester der typene nå er strengere.

Lykke til med testingen!