Migrálási útmutató
Átállás a Jest-ről
A Vitest-et úgy tervezték, hogy a Jest-tel kompatibilis API-val rendelkezzen, annak érdekében, hogy az átállás a Jest-ről a lehető legegyszerűbb legyen. Ezen erőfeszítések ellenére a következő különbségekkel találkozhatsz:
Alapértelmezett globális API
A Jest alapértelmezetten engedélyezi a globális API-t. A Vitest esetében ez nincs engedélyezve. Engedélyezheted a globális változókat a globals
konfigurációs beállításon keresztül, vagy frissítheted a kódodat, hogy a vitest
modulból importáljon.
Ha úgy döntesz, hogy letiltod a globális változókat, vedd figyelembe, hogy az olyan gyakori könyvtárak, mint a testing-library
, nem fogják automatikusan futtatni a DOM takarítását.
Modulok mockolása
Amikor egy modult mockolsz a Jestben, a gyártó függvény argumentumának visszatérési értéke az alapértelmezett export. A Vitest esetében a factory 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 kell frissíteni:
- jest.mock('./some-path', () => 'hello')
+ vi.mock('./some-path', () => ({
+ default: 'hello',
+ })
További részletekért kérjük, tekintsd meg a vi.mock
API szekciót.
Automatikus mockolási viselkedés
A Jest-tel ellentétben a <root>/__mocks__
mappában lévő mockolt modulok nincsenek betöltve, hacsak nem hívják meg a vi.mock()
-ot. Ha azt szeretnéd, hogy minden tesztben mockolva legyenek, mint a Jest-ben, akkor mockolhatod őket a setupFiles
belsejében.
Mockolt csomag eredetijének importálása
Ha csak részlegesen szimulálsz egy csomagot, akkor korábban használhattad a Jest requireActual
függvényét. A Vitest-ben ezeket a hívásokat a vi.importActual
-lal kell helyettesítened.
- const { cloneDeep } = jest.requireActual('lodash/cloneDeep')
+ const { cloneDeep } = await vi.importActual('lodash/cloneDeep')
Környezeti változók
A Jest-hez hasonlóan a Vitest is test
-re állítja a NODE_ENV
változót, ha az korábban nem volt beállítva. A Vitest a JEST_WORKER_ID
helyett a VITEST_POOL_ID
változót használja (ami mindig kisebb vagy egyenlő, mint a maxThreads
), tehát ha erre támaszkodsz, ne felejtsd el átnevezni. A Vitest ezenkívül elérhetővé teszi a VITEST_WORKER_ID
-t is, amely egy futó worker egyedi azonosítója - ezt a számot a maxThreads
nem befolyásolja, és minden létrehozott workerrel növekszik.
Ha módosítani szeretnéd a környezeti változókat, akkor a Jest-ben a replaceProperty API-t fogod használni, a Vitest-ben pedig a vi.stubEnv-et használhatod erre.
Done Callback
A Vitest v0.10.0-tól kezdve a tesztek callback stílusú deklarálása elavult. Átírhatod őket async
/await
függvények használatára, vagy használhatsz Promise-t a callback stílus utánzásához.
- it('should work', (done) => {
+ it('should work', () => new Promise(done => {
// ...
done()
- })
+ }))
Hookok
A beforeAll
/beforeEach
hookok bontó függvényt adhatnak vissza a Vitest esetében. Emiatt előfordulhat, hogy át kell írnod a hook definícióidat, ha azok undefined
-től vagy null
-tól eltérő értéket adnak vissza:
- beforeEach(() => setActivePinia(createTestingPinia()))
+ beforeEach(() => { setActivePinia(createTestingPinia()) })
Típusok
A Vitest nem kínál sok típust a Vi
névtérben, ez főként az illesztőkkel való kompatibilitás miatt van, ezért előfordulhat, hogy a típusokat közvetlenül a vitest
-ből kell importálnod ahelyett, hogy a Vi
névtérre támaszkodnál:
- let fn: jest.Mock<string, [string]>
+ import type { Mock } from 'vitest'
+ let fn: Mock<[string], string>
Továbbá, a Vitest-ben az Args
típus az első argumentum a Returns
helyett, ahogy a diff-ben láthatod.
Időzítők
A Vitest nem támogatja a Jest régi időzítőit.
Vue Pillanatképek
Ez nem kifejezetten Jest-specifikus funkció, de ha korábban a Jest-et a vue-cli preset-tel használtad, akkor telepítened kell a jest-serializer-vue
csomagot, és használnod kell a setupFiles belsejében:
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 pillanatképekben sok escape-elt "
karakter lesz.