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.