Przewodnik migracji
Migracja z Vitest 0.34.6
Minimalne wymagania
Vitest 1.0 wymaga Vite 5.0 i Node.js 18 lub nowszego.
Wszystkie podpakiety @vitest/*
wymagają Vitest w wersji 1.0.
Aktualizacja migawek #3961
Cudzysłowy w migawkach nie są już eskejpowane, a wszystkie migawki używają backticków (`) nawet jeśli ciąg znaków jest jednoliniowy.
- Cudzysłowy nie są już eskejpowane:
expect({ foo: 'bar' }).toMatchInlineSnapshot(`
Object {
- \\"foo\\": \\"bar\\",
+ "foo": "bar",
}
`)
- Migawki jednoliniowe używają teraz backticków (`) zamiast pojedynczych cudzysłowów ('):
- expect('some string').toMatchInlineSnapshot('"some string"')
+ expect('some string').toMatchInlineSnapshot(`"some string"`)
Wprowadzono również zmiany w pakiecie @vitest/snapshot
. Jeśli nie używasz go bezpośrednio, nie musisz niczego zmieniać.
- Nie musisz już rozszerzać
SnapshotClient
tylko po to, aby nadpisać metodęequalityCheck
: po prostu przekaż ją jakoisEqual
podczas inicjalizacji instancji. client.setTest
został przemianowany naclient.startCurrentRun
.client.resetCurrent
został przemianowany naclient.finishCurrentRun
.
Pule są ustandaryzowane #4172
Usunęliśmy wiele opcji konfiguracyjnych, aby uprościć dostosowanie programu uruchamiającego do Twoich potrzeb. Zapoznaj się z przykładami migracji, jeśli korzystasz z --threads
lub innych powiązanych flag.
--threads
to teraz--pool=threads
--no-threads
to teraz--pool=forks
--single-thread
to teraz--poolOptions.threads.singleThread
--experimental-vm-threads
to teraz--pool=vmThreads
--experimental-vm-worker-memory-limit
to teraz--poolOptions.vmThreads.memoryLimit
--isolate
to teraz--poolOptions.<nazwa_puli>.isolate
ibrowser.isolate
test.maxThreads
to teraztest.poolOptions.<nazwa_puli>.maxThreads
test.minThreads
to teraztest.poolOptions.<nazwa_puli>.minThreads
test.useAtomics
to teraztest.poolOptions.<nazwa_puli>.useAtomics
test.poolMatchGlobs.child_process
to teraztest.poolMatchGlobs.forks
test.poolMatchGlobs.experimentalVmThreads
to teraztest.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"
}
}
Zmiany w pokryciu kodu #4265, #4442
Opcja coverage.all
jest teraz domyślnie włączona. Oznacza to, że wszystkie pliki projektu pasujące do wzorca coverage.include
będą przetwarzane, nawet jeśli nie są wykonywane.
Zmieniono strukturę API progów pokrycia kodu i obsługuje teraz określanie progów dla określonych plików za pomocą wzorców glob.
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,
+ }
}
}
})
Typy Mock #4400
Kilka typów zostało usuniętych na rzecz nazewnictwa "Mock" zgodnego ze stylem Jest.
- import { EnhancedSpy, SpyInstance } from 'vitest'
+ import { MockInstance } from 'vitest'
WARNING
SpyInstance
jest przestarzały na rzecz MockInstance
i zostanie usunięty w następnej głównej wersji.
Mockowanie timerów #3925
vi.useFakeTimers()
nie mockuje już automatycznie process.nextTick
. Można nadal mockować process.nextTick
, jawnie określając go za pomocą vi.useFakeTimers({ toFake: ['nextTick'] })
.
Jednak mockowanie process.nextTick
nie jest możliwe przy użyciu --pool=forks
. Użyj innej opcji --pool
, jeśli potrzebujesz mockowania process.nextTick
.
Migracja z Jest
Vitest został zaprojektowany z API kompatybilnym z Jest, aby migracja z Jest była tak prosta, jak to możliwe. Pomimo tych wysiłków, możesz napotkać następujące różnice:
Zmienne globalne jako domyślne
Jest ma domyślnie włączone API zmiennych globalnych. Vitest nie. Możesz włączyć zmienne globalne za pomocą ustawienia konfiguracji 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 uruchamiać czyszczenia DOM.
Mockowanie modułów
Podczas mockowania modułu w Jest, wartość zwracana argumentu fabryki jest eksportem domyślnym. W Vitest argument fabryki musi zwracać obiekt z każdym eksportem zdefiniowanym jawnie. Na przykład, następujący jest.mock
musiałby zostać zaktualizowany w następujący sposób:
jest.mock('./some-path', () => 'hello');
vi.mock('./some-path', () => ({
default: 'hello',
}));
Więcej szczegółów można znaleźć w sekcji API vi.mock
.
Zachowanie automatycznego mockowania
W przeciwieństwie do Jest, zmockowane moduły w <root>/__mocks__
nie są ładowane, chyba że wywołasz vi.mock()
. Jeśli chcesz, aby były mockowane w każdym teście, tak jak w Jest, możesz je mockować wewnątrz setupFiles
.
Importowanie oryginału mockowanego pakietu
Jeśli mockujesz tylko częściowo pakiet, mogłeś wcześniej używać funkcji requireActual
z Jest. W Vitest powinieneś zastąpić te wywołania vi.importActual
.
const { cloneDeep } = jest.requireActual('lodash/cloneDeep');
const { cloneDeep } = await vi.importActual('lodash/cloneDeep');
Rozszerzanie mockowania na biblioteki zewnętrzne
Tam, gdzie Jest robi to domyślnie, podczas mockowania modułu i chcąc, aby to mockowanie zostało rozszerzone na inne biblioteki zewnętrzne, które używają tego samego modułu, powinieneś wyraźnie określić, którą bibliotekę zewnętrzną chcesz mockować, aby biblioteka zewnętrzna była częścią Twojego kodu źródłowego, używając server.deps.inline.
server.deps.inline: ["nazwa_biblioteki"]
Dostęp do wartości zwracanych mockowanej obietnicy
Zarówno Jest, jak i Vitest przechowują wyniki wszystkich wywołań mock w tablicy mock.results
, gdzie wartości zwracane każdego wywołania są przechowywane we właściwości value
. Jednak podczas mockowania lub szpiegowania obietnicy (np. za pomocą mockResolvedValue
), w Jest właściwość value
będzie obietnicą, podczas gdy w Vitest stanie się ona rozwiązaną wartością, gdy obietnica zostanie rozwiązana.
await expect(spy.mock.results[0].value).resolves.toBe(123);
expect(spy.mock.results[0].value).toBe(123);
Zmienne środowiskowe
Podobnie jak w Jest, Vitest ustawia NODE_ENV
na test
, jeśli nie został wcześniej ustawiony. Vitest ma również odpowiednik dla JEST_WORKER_ID
o nazwie VITEST_POOL_ID
(zawsze mniejszy lub równy maxThreads
), więc jeśli na nim polegasz, nie zapomnij go zmienić. Vitest udostępnia również VITEST_WORKER_ID
, który jest unikalnym identyfikatorem uruchomionego workera - ta liczba nie jest zależna od maxThreads
i będzie rosła z każdym utworzonym workerem.
Zastępowanie właściwości
Jeśli chcesz zmodyfikować obiekt, używając API replaceProperty w Jest, możesz użyć vi.stubEnv
lub vi.spyOn
, aby zrobić to samo również w Vitest.
Callback Done
Od wersji Vitest v0.10.0 styl deklarowania testów za pomocą callbacków jest przestarzały. Możesz je przepisać, aby używały funkcji async
/await
lub użyć Promise, aby naśladować styl callback.
it('should work', (done) => { // [!code --]
it('should work', () => new Promise(done => { // [!code ++]
// ...
done()
}) // [!code --]
})) // [!code ++]
Hooki
W Vitest hooki beforeAll
i beforeEach
mogą zwracać funkcję teardown. Z tego powodu możesz potrzebować przepisać deklaracje hooków, jeśli zwracają coś innego niż undefined
lub null
:
beforeEach(() => setActivePinia(createTestingPinia()));
beforeEach(() => {
setActivePinia(createTestingPinia());
});
W Jest hooki są wywoływane sekwencyjnie (jeden po drugim). Domyślnie Vitest uruchamia hooki równolegle. Aby użyć zachowania Jest, zaktualizuj opcję sequence.hooks
:
export default defineConfig({
test: {
sequence: {
hooks: 'list',
},
},
});
Typy
Vitest nie ma odpowiednika przestrzeni nazw jest
, więc będziesz musiał importować typy bezpośrednio z vitest
:
let fn: jest.Mock<string, [string]>;
import type { Mock } from 'vitest';
let fn: Mock<[string], string>;
Ponadto, Vitest ma typ Args
jako pierwszy argument zamiast Returns
, jak widać w diff.
Timery
Vitest nie obsługuje starszych timerów Jest.
Timeout
Jeśli używałeś jest.setTimeout
, musisz migrować do vi.setConfig
:
jest.setTimeout(5_000);
vi.setConfig({ testTimeout: 5_000 });
Migawki Vue
To nie jest funkcja specyficzna dla Jest, ale jeśli wcześniej używałeś Jest z presetem vue-cli, będziesz musiał 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 Twoje migawki będą miały dużo eskejpowanych znaków "
.