Průvodce migrací
Migrace z Jest
Vitest byl navržen s API kompatibilním s Jest, aby byla migrace co nejjednodušší. I přes tuto snahu se můžete setkat s následujícími rozdíly:
Globální proměnné jsou ve výchozím nastavení zakázány
Jest má ve výchozím nastavení povolené globální API. Vitest nikoliv. Můžete buď povolit globální proměnné pomocí nastavení konfigurace globals, nebo aktualizovat kód tak, aby místo toho používal importy z modulu vitest.
Pokud se rozhodnete neaktivovat globální proměnné, mějte na paměti, že běžné knihovny jako testing-library nebudou automaticky spouštět DOM cleanup.
Nastavování mocků modulů
Při mockování modulu v Jest je návratová hodnota factory funkce výchozí export modulu. Ve Vitest musí factory funkce vracet objekt s explicitně definovanými exporty. Například následující jest.mock by musel být aktualizován takto:
- jest.mock('./some-path', () => 'hello')
+ vi.mock('./some-path', () => ({
+ default: 'hello',
+ })Pro více informací se podívejte na sekci API vi.mock.
Chování automatických mocků
Na rozdíl od Jest, pokud není volána funkce vi.mock(), mockované moduly ve složce <root>/__mocks__ nejsou načteny. Pokud je potřebujete simulovat v každém testu, podobně jako v Jest, můžete je mockovat uvnitř setupFiles.
Importování originálu mockovaného balíčku
Pokud částečně simulujete balíček, možná jste dříve používali funkci requireActual z Jest. Ve Vitest byste měli tato volání nahradit vi.importActual.
- const { cloneDeep } = jest.requireActual('lodash/cloneDeep')
+ const { cloneDeep } = await vi.importActual('lodash/cloneDeep')Proměnné prostředí
Stejně jako Jest, Vitest nastavuje NODE_ENV na test, pokud nebyla nastavena dříve. Vitest má také ekvivalent pro JEST_WORKER_ID s názvem VITEST_POOL_ID (vždy menší nebo roven maxThreads). Pokud se spoléháte na JEST_WORKER_ID, nezapomeňte ji přejmenovat na VITEST_POOL_ID. Vitest také zpřístupňuje VITEST_WORKER_ID, což je jedinečné ID spuštěného workeru - toto číslo není ovlivněno maxThreads a bude se zvyšovat s každým vytvořeným workerem.
Pokud chcete změnit proměnné prostředí a používáte replaceProperty API v Jest, můžete použít vi.stubEnv k tomu i ve Vitest.
Done Callback
Od Vitest v0.10.0 je styl deklarování testů pomocí callbacku považován za zastaralý. Můžete je přepsat tak, aby používaly funkce async/await, nebo použít Promise k napodobení callback stylu.
- it('should work', (done) => {
+ it('should work', () => new Promise(done => {
// ...
done()
- })
+ }))Hooky
beforeAll/beforeEach hooky mohou ve Vitest vracet teardown funkci. Z tohoto důvodu můžete potřebovat přepsat deklarace hooků, pokud vracejí něco jiného než undefined nebo null:
- beforeEach(() => setActivePinia(createTestingPinia()))
+ beforeEach(() => { setActivePinia(createTestingPinia()) })Typy
Vitest nezpřístupňuje mnoho typů v namespacu Vi. Ten existuje hlavně pro kompatibilitu s matchery (porovnávači), takže možná budete muset importovat typy přímo z vitest namísto spoléhání se na namespace Vi:
- let fn: jest.Mock<string, [string]>
+ import type { Mock } from 'vitest'
+ let fn: Mock<[string], string>Kromě toho má Vitest typ Args jako první argument namísto Returns, jak můžete vidět v diff.
Časovače
Vitest nepodporuje starší časovače Jest.
Vue Snímky
Toto není funkce specifická pro Jest, ale pokud jste dříve používali Jest s vue-cli preset, budete muset nainstalovat balíček jest-serializer-vue a použít jej uvnitř setupFiles:
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);Jinak budou mít vaše snímky spoustu escapovaných uvozovek "。