Migrációs útmutató
Migrálás Vitest 2.0-ra
Az alapértelmezett Pool forks
A Vitest 2.0-ban a pool
alapértelmezett konfigurációja 'forks'
-ra változott a jobb stabilitás érdekében. A teljes indoklást elolvashatja a PR linken.
Ha korábban a poolOptions
-t pool
megadása nélkül használta, frissítenie kell a konfigurációt az alábbiak szerint:
export default defineConfig({
test: {
poolOptions: {
threads: {
singleThread: true,
},
forks: {
singleFork: true,
},
},
},
});
A Hook-ok sorosan futnak
A Vitest 2.0 előtt minden hook párhuzamosan futott. A 2.0-ban minden hook sorosan fut. Ezenkívül az afterAll
/afterEach
hook-ok fordított sorrendben futnak.
A hook-ok párhuzamos végrehajtásának visszaállításához módosítsa a sequence.hooks
értékét 'parallel'
-re:
export default defineConfig({
test: {
sequence: {
hooks: 'parallel',
},
},
});
A suite.concurrent
minden tesztet párhuzamosan futtat
Korábban a concurrent
megadása egy tesztcsoporton belül csoportosította a párhuzamos teszteket tesztcsoportonként, sorosan futtatva őket. Mostantól, a Jest viselkedését követve, minden teszt párhuzamosan fut (a maxConcurrency
korlátok figyelembevételével).
A V8 Coverage coverage.ignoreEmptyLines
alapértelmezetten engedélyezve van
A coverage.ignoreEmptyLines
alapértelmezett értéke mostantól true
. Ez a jelentős változás befolyásolhatja a kódlefedettségi jelentéseket, ami egyes projektek esetében a lefedettségi küszöbök módosítását teheti szükségessé. Ez a módosítás csak az alapértelmezett beállítást érinti, ha a coverage.provider
értéke 'v8'
.
A watchExclude
opció eltávolítása
A Vitest a Vite figyelő rendszerét használja. A fájlokat vagy könyvtárakat kizárhatja úgy, hogy hozzáadja őket a server.watch.ignored
listához:
export default defineConfig({
server: {
watch: {
ignored: ['!node_modules/examplejs'],
},
},
});
--segfault-retry
eltávolítva
Az alapértelmezett pool változásaival ez az opció már nem szükséges. Ha szegmens hibákat tapasztal, próbálja meg átváltani a 'forks'
poolra. Ha a probléma továbbra is fennáll, kérjük, nyisson egy új hibajegyet reprodukcióval.
Üres feladat a Suite feladatokban eltávolítva
Ez a változás a fejlett task API -t érinti. Korábban a .suite
bejárása egy üres belső tesztcsoporthoz vezetett, amelyet fájlfeladatként használtak.
Ezáltal a .suite
opcionálissá válik; ha a feladat a legfelső szinten van definiálva, akkor nem tartozik tesztcsoporthoz. Visszaállhat a .file
tulajdonságra, amely mostantól minden feladaton (beleértve magát a fájlfeladatot is) elérhető, ezért ügyeljen arra, hogy ne kerüljön végtelen rekurzióba.
Ez a változás eltávolítja a fájlt az expect.getState().currentTestName
-ből, és az expect.getState().testPath
-t kötelezővé teszi.
A task.meta
hozzáadva a JSON Reporterhez
A JSON reporter mostantól minden állítási eredményhez megjeleníti a task.meta
-t.
Egyszerűsített általános típusok a Mock függvényekhez (pl. vi.fn<T>
, Mock<T>
)
Korábban a vi.fn<TArgs, TReturn>
két külön általános típust fogadott el az argumentumokhoz és a visszatérési értékhez. Ez mostantól közvetlenül egy függvénytípust fogad el vi.fn<T>
a használat egyszerűsítése érdekében.
import { type Mock, vi } from 'vitest';
const add = (x: number, y: number): number => x + y;
// vi.fn<T> használata
const mockAdd = vi.fn<Parameters<typeof add>, ReturnType<typeof add>>();
const mockAdd = vi.fn<typeof add>();
// Mock<T> használata
const mockAdd: Mock<Parameters<typeof add>, ReturnType<typeof add>> = vi.fn();
const mockAdd: Mock<typeof add> = vi.fn();
Feloldott mock.results
elérése
Korábban a Vitest feloldotta a mock.results
értékeket, ha a függvény Promise-t adott vissza. Most van egy külön mock.settledResults
tulajdonság, amely csak akkor populálódik, ha a visszaadott Promise feloldódott vagy elutasításra került.
const fn = vi.fn().mockResolvedValueOnce('result');
await fn();
const result = fn.mock.results[0]; // 'result'
const result = fn.mock.results[0]; // 'Promise<result>'
const settledResult = fn.mock.settledResults[0]; // 'result'
Ezzel a változással új toHaveResolved*
illesztőket is bevezetünk, hasonlóan a toHaveReturned
-hez, hogy megkönnyítsük a migrációt, ha korábban a toHaveReturned
-t használta:
const fn = vi.fn().mockResolvedValueOnce('result');
await fn();
expect(fn).toHaveReturned('result');
expect(fn).toHaveResolved('result');
Böngésző mód
A Vitest böngésző módja számos változtatáson esett át a béta fázis alatt. A böngésző mód filozófiájáról a GitHub vitafórumon olvashat.
A változtatások többsége bővítés volt, de volt néhány kisebb törést okozó változás:
- A
none
szolgáltatótpreview
-ra nevezték át #5842 - A
preview
szolgáltató mostantól alapértelmezett #5842 - Az
indexScripts
átnevezésre kerültorchestratorScripts
-re #5842
Elavult opciók eltávolítva
Néhány elavult opciót töröltek:
vitest typecheck
parancs - helyette használja avitest --typecheck
parancsotVITEST_JUNIT_CLASSNAME
ésVITEST_JUNIT_SUITE_NAME
környezeti változók (helyette használja a reporter opciókat)c8
lefedettség ellenőrzése (helyette használja a coverage-v8-at)SnapshotEnvironment
exportálása avitest
-ből - helyette importálja avitest/snapshot
-bólSpyInstance
eltávolítva aMockInstance
javára
Migrálás Vitest 1.0-ra
Minimális követelmények
A Vitest 1.0-hoz Vite 5.0 és Node.js 18 vagy újabb verzió szükséges.
Minden @vitest/*
alcsomaghoz Vitest 1.0-s verzió szükséges.
Pillanatképek frissítése #3961
A pillanatképekben lévő idézőjelek már nincsenek escape-elve, és minden pillanatkép backtick-eket (`) használ, még akkor is, ha a string csak egyetlen sor.
- Az idézőjelek már nincsenek escape-elve:
expect({ foo: 'bar' }).toMatchInlineSnapshot(`
Object {
- \\"foo\\": \\"bar\\",
+ "foo": "bar",
}
`)
- Az egysoros pillanatképek mostantól "`" idézőjeleket használnak a ':' helyett:
- expect('some string').toMatchInlineSnapshot('"some string"')
+ expect('some string').toMatchInlineSnapshot(`"some string"`)
Változások történtek a @vitest/snapshot
csomagban is (#4076). Ha nem használja közvetlenül, akkor nem kell semmit sem változtatnia.
- Már nem kell kiterjesztenie a
SnapshotClient
-et csak azequalityCheck
metódus felülírásához: egyszerűen adja átisEqual
-ként egy példány inicializálásakor - A
client.setTest
átnevezésre kerültclient.startCurrentRun
-ra - A
client.resetCurrent
átnevezésre kerültclient.finishCurrentRun
-ra
A Pool-ok szabványosítva lettek #4172
Sok konfigurációs opciót eltávolítottunk, hogy könnyebbé tegyük a tesztfuttató konfigurálását az Ön igényeinek megfelelően. Kérjük, tekintse meg a migrációs példákat, ha a --threads
vagy más kapcsolódó jelzőkre támaszkodik.
--threads
mostantól--pool=threads
--no-threads
mostantól--pool=forks
--single-thread
mostantól--poolOptions.threads.singleThread
--experimental-vm-threads
mostantól--pool=vmThreads
--experimental-vm-worker-memory-limit
mostantól--poolOptions.vmThreads.memoryLimit
--isolate
mostantól--poolOptions.<pool-name>.isolate
ésbrowser.isolate
test.maxThreads
mostantóltest.poolOptions.<pool-name>.maxThreads
test.minThreads
mostantóltest.poolOptions.<pool-name>.minThreads
test.useAtomics
mostantóltest.poolOptions.<pool-name>.useAtomics
test.poolMatchGlobs.child_process
mostantóltest.poolMatchGlobs.forks
test.poolMatchGlobs.experimentalVmThreads
mostantóltest.poolMatchGlobs.vmThreads
{
scripts: {
- "test": "vitest --no-threads"
// Azonos viselkedéshez:
+ "test": "vitest --pool forks --poolOptions.forks.singleFork"
// Vagy több párhuzamos fork:
+ "test": "vitest --pool forks"
}
}
{
scripts: {
- "test": "vitest --experimental-vm-threads"
+ "test": "vitest --pool vmThreads"
}
}
{
scripts: {
- "test": "vitest --isolate false"
+ "test": "vitest --poolOptions.threads.isolate false"
}
}
{
scripts: {
- "test": "vitest --no-threads --isolate false"
+ "test": "vitest --pool forks --poolOptions.forks.isolate false"
}
}
Változások a lefedettségben #4265, #4442
A coverage.all
mostantól alapértelmezés szerint engedélyezett. Ez azt jelenti, hogy minden projektfájl, amely megfelel a coverage.include
mintának, feldolgozásra kerül, még akkor is, ha nem kerül végrehajtásra.
A lefedettségi küszöbök API-jának szerkezete megváltozott, és mostantól támogatja a küszöbök megadását specifikus fájlokhoz glob minták használatával:
export default defineConfig({
test: {
coverage: {
- perFile: true,
- thresholdAutoUpdate: true,
- 100: true,
- lines: 100,
- functions: 100,
- branches: 100,
- statements: 100,
+ thresholds: {
+ perFile: true,
+ autoUpdate: true,
+ 100: true,
+ lines: 100,
+ functions: 100,
+ branches: 100,
+ statements: 100,
+ }
}
}
})
Mock típusok #4400
Néhány típust eltávolítottak a Jest-stílusú "Mock" elnevezés mellett.
- import { EnhancedSpy, SpyInstance } from 'vitest'
+ import { MockInstance } from 'vitest'
WARNING
A SpyInstance
elavult a MockInstance
javára, és a következő főverzióban eltávolításra kerül.
Időzítő mockok #3925
A vi.useFakeTimers()
már nem mockolja automatikusan a process.nextTick
-et. A process.nextTick
továbbra is explicit módon mockolható a vi.useFakeTimers({ toFake: ['nextTick'] })
használatával.
Azonban a process.nextTick
mockolása nem lehetséges, ha a --pool=forks
opciót használja. Használjon másik --pool
opciót, ha szüksége van a process.nextTick
mockolására.
Migrálás Jest-ről
A Vitest tervezésekor a Jest-kompatibilis API-t vettük alapul, hogy a Jest-ről való migráció a lehető legegyszerűbb legyen. Ennek ellenére a következő eltérésekre kell felkészülnie:
Globális változók alapértelmezés szerint
A Jest alapértelmezés szerint engedélyezi a globális API-t. A Vitest nem. Engedélyezheti a globális változókat a globals
konfigurációs beállításon keresztül, vagy frissítheti a kódját, hogy a vitest
modulból importálja a funkciókat.
Ha úgy dönt, hogy a globális változókat letiltva tartja, vegye figyelembe, hogy az olyan gyakori könyvtárak, mint a testing-library
, nem végeznek automatikus DOM tisztítást.
Modul Mock-ok
Amikor egy modult mockolunk Jest-ben, a factory függvény argumentumának visszatérési értéke az alapértelmezett export. Vitest-ben a gyári argumentumnak egy objektumot kell visszaadnia, amelyben minden export explicit módon definiálva van. Például a következő jest.mock
-ot a következőképpen kellene frissíteni:
jest.mock('./some-path', () => 'hello');
vi.mock('./some-path', () => ({
default: 'hello',
}));
További részletekért lásd a vi.mock
api szekciót.
Automatikus Mockolási viselkedés
A Jesttől eltérően a <root>/__mocks__
mappában lévő mockolt modulok csak akkor töltődnek be, ha meghívjuk a vi.mock()
függvényt. Ha azt szeretné, hogy minden tesztben utánzva legyenek, mint a Jest-ben, akkor mockolhatja őket a setupFiles
-ban.
Egy mockolt csomag eredetijének importálása
Ha csak részlegesen mockol egy csomagot, korábban valószínűleg a Jest requireActual
függvényét használta. Vitestben ezeket a hívásokat a vi.importActual
-ra kell cserélnie.
const { cloneDeep } = jest.requireActual('lodash/cloneDeep');
const { cloneDeep } = await vi.importActual('lodash/cloneDeep');
Mockolás kiterjesztése külső könyvtárakra
Míg a Jest alapértelmezetten kiterjeszti a mockolást, egy modul mockolásakor, ha azt szeretné, hogy ez a mockolás kiterjedjen más külső könyvtárakra is, amelyek ugyanazt a modult használják, explicit módon meg kell adnia, melyik harmadik féltől származó könyvtárat szeretné mockolni. Így a külső könyvtár a forráskódjának részévé válik, a server.deps.inline használatával.
server.deps.inline: ["lib-name"]
expect.getState().currentTestName
A Vitest test
nevei >
szimbólummal vannak összekapcsolva, hogy könnyebben megkülönböztethetők legyenek a tesztek a suite-októl, míg a Jest üres szóközt () használ.
- `${describeTitle} ${testTitle}`
+ `${describeTitle} > ${testTitle}`
Környezeti változók
A Jest-hez hasonlóan a Vitest is test
értékre állítja a NODE_ENV
-et, ha korábban nem volt beállítva. A Vitest-nek van egy megfelelője a JEST_WORKER_ID
-nek, a VITEST_POOL_ID
(mindig kisebb vagy egyenlő, mint a maxThreads
), így ha erre támaszkodik, ne felejtse el átnevezni. A Vitest emellett exponálja a VITEST_WORKER_ID
-t is, amely egy futó worker egyedi azonosítója - ezt a számot nem befolyásolja a maxThreads
, és minden létrehozott workerrel növekedni fog.
Tulajdonság cseréje
Ha módosítani szeretné az objektumot, a Jest-ben a replaceProperty API -t használja, Vitest-ben pedig a vi.stubEnv
vagy a vi.spyOn
is használható ugyanehhez.
Done Callback
A Vitest v0.10.0-tól kezdve a tesztek callback stílusú deklarálása elavult. Átírhatja őket async
/await
függvényekre, vagy használhat Promise-t a callback stílus imitálására.
it('should work', (done) => { // [!code --]
it('should work', () => new Promise(done => { // [!code ++]
// ...
done()
}) // [!code --]
})) // [!code ++]
Hook-ok
A beforeAll
/beforeEach
hook-ok visszaadhatnak egy teardown függvényt a Vitest-ben. Emiatt előfordulhat, hogy át kell írnia a hook definícióit, ha azok nem undefined
vagy null
értéket adnak vissza:
beforeEach(() => setActivePinia(createTestingPinia()));
beforeEach(() => {
setActivePinia(createTestingPinia());
});
A Jest-ben a hook-ok sorosan (egymás után) futnak le. Alapértelmezés szerint a Vitest párhuzamosan futtatja a hook-okat. A Jest viselkedésének használatához frissítse a sequence.hooks
opciót:
export default defineConfig({
test: {
sequence: {
hooks: 'list',
},
},
});
Típusok
A Vitest nem rendelkezik a jest
névtér ekvivalensével, ezért a típusokat közvetlenül a vitest
-ből kell importálnia:
let fn: jest.Mock<(name: string) => number>;
import type { Mock } from 'vitest';
let fn: Mock<(name: string) => number>;
Időzítők
A Vitest nem támogatja a Jest régi időzítőit.
Időtúllépés
Ha a jest.setTimeout
-ot használta, át kell térnie a vi.setConfig
-ra:
jest.setTimeout(5_000);
vi.setConfig({ testTimeout: 5_000 });
Vue pillanatképek
Ez nem Jest-specifikus funkció, de ha korábban Jest-et használt vue-cli preset-tel, akkor telepítenie kell a jest-serializer-vue
csomagot, és használnia kell a setupFiles -ban:
import { defineConfig } from 'vite';
export default defineConfig({
test: {
setupFiles: ['./tests/unit/setup.js'],
},
});
import vueSnapshotSerializer from 'jest-serializer-vue';
expect.addSnapshotSerializer(vueSnapshotSerializer);
Ellenkező esetben a pillanatképei sok escape-elt "
karaktert tartalmaznak majd.