Migrálási útmutató
Migrálás Vitest 0.34.6-ról
Minimális követelmények
A Vitest 1.0 Vite 5.0-át és Node.js 18 vagy újabb verziót igényel.
Az összes @vitest/*
alcsomaghoz Vitest 1.0 verzió szükséges.
Pillanatképek frissítése #3961
A pillanatfelvételekben az idézőjelek már nincsenek escape-elve, és minden pillanatfelvétel backtick (`) idézőjeleket használ, még akkor is, ha a szöveg csak egyetlen sor.
- Az idézőjelek már nincsenek escape-elve:
expect({ foo: 'bar' }).toMatchInlineSnapshot(`
Object {
- \\"foo\\": \\"bar\\",
+ "foo": "bar",
}
`)
- Az egysoros pillanatfelvételek most "`" idézőjeleket használnak a ':' helyett:
- expect('some string').toMatchInlineSnapshot('"some string"')
+ expect('some string').toMatchInlineSnapshot(`"some string"`)
A @vitest/snapshot
csomagban is történtek változások. Ha nem használod közvetlenül, nem szükséges módosítanod semmit.
- Már nem kell kiterjesztened a
SnapshotClient
-et csak azért, hogy felülírd azequalityCheck
metódust: csak add átisEqual
paraméterként a példányosításkor. - A
client.setTest
átnevezveclient.startCurrentRun
-ra - A
client.resetCurrent
átnevezveclient.finishCurrentRun
-ra
A pool-ok szabványosítva #4172
Eltávolítottunk sok konfigurációs opciót, hogy könnyebben konfigurálhasd a tesztkörnyezetet az igényeidnek megfelelően. Kérlek, nézd meg a migrációs példákat, ha a --threads
vagy más kapcsolódó kapcsolókra támaszkodsz.
- A
--threads
most--pool=threads
- A
--no-threads
most--pool=forks
- A
--single-thread
most--poolOptions.threads.singleThread
- A
--experimental-vm-threads
most--pool=vmThreads
- A
--experimental-vm-worker-memory-limit
most--poolOptions.vmThreads.memoryLimit
- Az
--isolate
most--poolOptions.<pool-name>.isolate
ésbrowser.isolate
- A
test.maxThreads
mosttest.poolOptions.<pool-name>.maxThreads
- A
test.minThreads
mosttest.poolOptions.<pool-name>.minThreads
- A
test.useAtomics
mosttest.poolOptions.<pool-name>.useAtomics
- A
test.poolMatchGlobs.child_process
mosttest.poolMatchGlobs.forks
- A
test.poolMatchGlobs.experimentalVmThreads
mosttest.poolMatchGlobs.vmThreads
{
scripts: {
- "test": "vitest --no-threads"
// For identical behaviour:
+ "test": "vitest --pool forks --poolOptions.forks.singleFork"
// Or multi parallel forks:
+ "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
opció jelenleg alapértelmezés szerint engedélyezve van. Ez azt jelenti, hogy a coverage.include
mintára illeszkedő összes projektfájl feldolgozásra kerül, még akkor is, ha nem futnak le a tesztek során.
Megváltozott a lefedettségi küszöbértékek API-ja, amely mostantól támogatja a küszöbértékek glob mintákkal történő megadását konkrét fájlokhoz.
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 változása #4400
Eltávolítottunk néhány típust a Jest-stílusú "Mock" elnevezés egységesítése érdekében.
- import { EnhancedSpy, SpyInstance } from 'vitest'
+ import { MockInstance } from 'vitest'
WARNING
A SpyInstance
elavult a MockInstance
javára, és a következő fő verzióban el lesz távolítva.
Időzítő mock-ok #3925
A vi.useFakeTimers()
mostantól nem helyettesíti automatikusan a process.nextTick
működését. Továbbra is lehetséges a process.nextTick
mock-olása, ha explicit módon megadod a vi.useFakeTimers({ toFake: ['nextTick'] })
használatával.
Azonban a process.nextTick
helyettesítése nem lehetséges a --pool=forks
használatakor. Használj másik --pool
opciót, ha szükséged van a process.nextTick
funkcióra.
Migrálás Jest-ről
A Vitest a Jest API-jával való kompatibilitásra lett tervezve, hogy a Jest-ről való átállás minél egyszerűbb legyen. Ennek ellenére a következő különbségek merülhetnek fel:
Globális változók alapértelmezettként
A Jest-nek alapértelmezés szerint engedélyezve van a globális API. A Vitest-nek nincs. Engedélyezheted a globális változókat a globals
konfigurációs beállításon keresztül, vagy frissítheted a kódot, hogy a vitest
modulból importáljon.
Ha a globális változók használata helyett a modul importálást választod, vedd figyelembe, hogy a gyakori könyvtárak, mint például a testing-library
, nem fogják automatikusan futtatni a DOM cleanup funkciót.
Modulok mock-olása
Jest esetén egy modul helyettesítésekor a factory argumentum visszatérési értéke az alapértelmezett export lesz. Vitest esetén a factory argumentumnak egy objektumot kell visszaadnia, amelyben minden export explicit módon definiált. Például a következő jest.mock
-ot a következőképpen kell frissíteni:
jest.mock('./some-path', () => 'hello');
vi.mock('./some-path', () => ({
default: 'hello',
}));
További részletekért kérlek, tekintsd meg a vi.mock
API szekciót.
Automatikus Mock-olási viselkedés
Eltérően a Jest-től, a <root>/__mocks__
mappában található helyettesítő modulok nem töltődnek be automatikusan, csak a vi.mock()
meghívásakor. Ha azt szeretnéd, hogy minden tesztben mock-olva legyenek, mint a Jest-ben, akkor mock-olhatod őket a setupFiles
belsejében.
Mock-olt csomag eredetijének importálása
Ha egy csomagot csak részlegesen helyettesítesz, a Jest-ben a requireActual
függvényt használhattad. Vitest-ben ezeket a hívásokat a vi.importActual
-ra kell cserélned.
const { cloneDeep } = jest.requireActual('lodash/cloneDeep');
const { cloneDeep } = await vi.importActual('lodash/cloneDeep');
A mock-olás kiterjesztése külső könyvtárakra
Jest esetén ez alapértelmezett viselkedés. Ha egy modul helyettesítését ki szeretnéd terjeszteni más, ugyanazt a modult használó külső könyvtárakra is, explicit módon meg kell adnod, mely külső könyvtárakra vonatkozzon a helyettesítés. Ehhez a server.deps.inline beállítást kell használnod, hogy a külső könyvtár a forráskódod részévé váljon.
server.deps.inline: ["lib-name"]
A mock-olt Promise visszatérési értékeinek elérése
Mind a Jest, mind a Vitest a mock.results
tömbben tárolja a helyettesítő hívások eredményeit, ahol az egyes hívások visszatérési értékei a value
tulajdonságban találhatók. Ha egy Promise-t helyettesítesz vagy figyelsz (pl. a mockResolvedValue
használatával), Jest esetén a value
tulajdonság egy Promise lesz, míg Vitest esetén a Promise feloldásakor a value
tulajdonság a feloldott értéket fogja tartalmazni.
await expect(spy.mock.results[0].value).resolves.toBe(123);
expect(spy.mock.results[0].value).toBe(123);
Környezeti változók
A Jest-hez hasonlóan a Vitest is test
-re állítja a NODE_ENV
környezeti változót, ha az korábban nem volt beállítva. A JEST_WORKER_ID
környezeti változónak a Vitest-ben a VITEST_POOL_ID
felel meg (melynek értéke mindig kisebb vagy egyenlő, mint a maxThreads
). Ha erre támaszkodsz, ne felejtsd el átnevezni. A Vitest emellett elérhetővé teszi a VITEST_WORKER_ID
környezeti változót is, amely egy futó worker egyedi azonosítója. Ennek az értékét nem befolyásolja a maxThreads
, és minden létrehozott workerrel növekszik.
Tulajdonság cseréje
Ha egy objektum tulajdonságát szeretnéd módosítani, Jest esetén a replaceProperty API-t használhatod. Vitest-ben a vi.stubEnv
vagy a vi.spyOn
függvényekkel érheted el ugyanezt.
Done Callback
A Vitest v0.10.0 verziójától kezdve a tesztek callback stílusú deklarálása elavultnak minősül. Javasolt az async
/await
függvények használata, vagy a callback stílus Promise-ekkel való helyettesítése.
it('should work', (done) => { // [!code --]
it('should work', () => new Promise(done => { // [!code ++]
// ...
done()
}) // [!code --]
})) // [!code ++]
Hook-ok
A beforeAll
/beforeEach
hook-ok Vitest-ben teardown függvényt adhatnak vissza. Emiatt szükség lehet a hook deklarációk módosítására, ha azok undefined
vagy null
értéktől eltérő értéket adnak vissza.
beforeEach(() => setActivePinia(createTestingPinia()));
beforeEach(() => {
setActivePinia(createTestingPinia());
});
Jest esetén a hook-ok szekvenciálisan (egymás után) futnak le. Ezzel szemben a Vitest alapértelmezés szerint párhuzamosan futtatja a hook-okat. A Jest viselkedésének eléréséhez módosítsd a sequence.hooks
opciót.
export default defineConfig({
test: {
sequence: {
hooks: 'list',
},
},
});
Típusok
A Vitest nem rendelkezik a Jest jest
névterének megfelelőjével, ezért a típusokat közvetlenül a vitest
modulból kell importálnod.
let fn: jest.Mock<string, [string]>;
import type { Mock } from 'vitest';
let fn: Mock<[string], string>;
A Vitest-ben az Args
típus az első argumentum a Returns
helyett, ahogy az a diff-ben is látható.
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áltad, akkor át kell migrálnod a vi.setConfig
-ra:
jest.setTimeout(5_000);
vi.setConfig({ testTimeout: 5_000 });
Vue Pillanatképek
Ez nem egy Jest-specifikus funkció, de ha korábban a Jest-et a vue-cli preset-tel használtad, telepítened kell a jest-serializer-vue
csomagot, és be kell állítanod a setupFiles fájlban:
vite.config.js
import { defineConfig } from 'vite';
export default defineConfig({
test: {
setupFiles: ['./tests/unit/setup.js'],
},
});
tests/unit/setup.js
import vueSnapshotSerializer from 'jest-serializer-vue';
expect.addSnapshotSerializer(vueSnapshotSerializer);
Ellenkező esetben a pillanatfelvételekben sok escape-elt "
karakter fog szerepelni.