Przewodnik migracji
Migracja z Jest
Vitest został zaprojektowany z API kompatybilnym z Jest, aby maksymalnie uprościć migrację. Pomimo tych starań, możesz napotkać następujące różnice:
Domyślne zmienne globalne
Jest domyślnie włącza swoje globalne API. Vitest tego nie robi. Możesz włączyć zmienne globalne za pomocą opcji konfiguracyjnej globals lub zaktualizować kod, aby używać importów z modułu vitest.
Jeśli zdecydujesz się pozostawić zmienne globalne wyłączone, pamiętaj, że popularne biblioteki, takie jak testing-library, nie będą automatycznie przeprowadzać czyszczenia DOM.
Mockowanie modułów
W Jest, podczas mockowania modułu, wartość zwracana przez funkcję fabrykującą jest traktowana jako eksport domyślny. W Vitest funkcja fabrykująca musi zwrócić obiekt z każdym eksportem zdefiniowanym w sposób jawny. Na przykład, następujący jest.mock wymaga aktualizacji:
- jest.mock('./some-path', () => 'hello')
+ vi.mock('./some-path', () => ({
+ default: 'hello',
+ })Więcej szczegółów znajdziesz w sekcji API vi.mock.
Automatyczne mockowanie
W przeciwieństwie do Jest, moduły mockowane w <root>/__mocks__ nie są ładowane, chyba że zostanie wywołane vi.mock(). Jeśli chcesz, aby były mockowane w każdym teście, tak jak w Jest, możesz je zamockować w setupFiles.
Importowanie oryginalnej wersji mockowanego pakietu
Jeśli mockujesz tylko część pakietu, mogłeś wcześniej korzystać z funkcji requireActual w Jest. W Vitest powinieneś zastąpić te wywołania przez vi.importActual.
- const { cloneDeep } = jest.requireActual('lodash/cloneDeep')
+ const { cloneDeep } = await vi.importActual('lodash/cloneDeep')Zmienne środowiskowe
Podobnie jak Jest, Vitest ustawia NODE_ENV na test, jeśli nie został wcześniej ustawiony. Vitest ma również odpowiednik zmiennej JEST_WORKER_ID, którym jest VITEST_POOL_ID (zawsze mniejszy lub równy wartości maxThreads). Jeśli używasz JEST_WORKER_ID, zmień nazwę na VITEST_POOL_ID. Vitest udostępnia również VITEST_WORKER_ID, który jest unikalnym identyfikatorem uruchomionego workera - ta liczba nie zależy od maxThreads i rośnie z każdym utworzonym workerem.
Jeśli chcesz zmodyfikować zmienne środowiskowe, używając replaceProperty API w Jest, możesz użyć vi.stubEnv w Vitest w ten sam sposób.
Funkcja zwrotna Done
Od Vitest v0.10.0, deklarowanie testów z użyciem callbacków jest przestarzałe. Możesz je przepisać, aby używać async/await lub Promise, aby naśladować styl funkcji zwrotnej.
- it('should work', (done) => {
+ it('should work', () => new Promise(done => {
// ...
done()
- })
+ }))Hooki
Hooki beforeAll/beforeEach w Vitest mogą zwracać funkcję teardown. Jeśli twoje deklaracje hooków zwracają coś innego niż undefined lub null, konieczne może być ich przepisanie:
- beforeEach(() => setActivePinia(createTestingPinia()))
+ beforeEach(() => { setActivePinia(createTestingPinia()) })Typy
Vitest nie udostępnia wielu typów w przestrzeni nazw Vi. Przestrzeń ta istnieje głównie w celu zapewnienia kompatybilności z matcherami. Zamiast polegać na przestrzeni nazw Vi, możesz importować typy bezpośrednio z vitest:
- let fn: jest.Mock<string, [string]>
+ import type { Mock } from 'vitest'
+ let fn: Mock<[string], string>Ponadto, Vitest przyjmuje typ Args jako pierwszy argument zamiast Returns, jak pokazano w przykładzie.
Timery
Vitest nie obsługuje starszych timerów Jest.
Migawki Vue
Nie jest to funkcja specyficzna dla Jest, ale jeśli wcześniej używałeś Jest z presetem vue-cli, musisz zainstalować pakiet jest-serializer-vue i użyć go wewnątrz 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);W przeciwnym razie w migawkach pojawi się wiele znaków " wymagających escape'owania.