Průvodce migrací
Migrace z Vitest 0.34.6
Minimální požadavky
Vitest 1.0 vyžaduje Vite 5.0 a Node.js 18 nebo vyšší.
Všechny dílčí balíčky @vitest/*
vyžadují Vitest verzi 1.0.
Aktualizace snímků #3961
Uvozovky ve snímcích již nejsou escapovány. Všechny snímky používají zpětné uvozovky (`) i v případě, že řetězec obsahuje pouze jeden řádek.
- Uvozovky již nejsou escapovány.
expect({ foo: 'bar' }).toMatchInlineSnapshot(`
Object {
- \\"foo\\": \\"bar\\",
+ "foo": "bar",
}
`)
- Jednořádkové snímky nyní používají zpětné uvozovky "`" místo ':
- expect('some string').toMatchInlineSnapshot('"some string"')
+ expect('some string').toMatchInlineSnapshot(`"some string"`)
Došlo také ke změnám v balíčku @vitest/snapshot
. Pokud jej nepoužíváte přímo, není nutné provádět žádné změny.
- Již nemusíte rozšiřovat
SnapshotClient
pouze proto, abyste přepsali metoduequalityCheck
: stačí ji předat jakoisEqual
při inicializaci instance. client.setTest
byl přejmenován naclient.startCurrentRun
.client.resetCurrent
byl přejmenován naclient.finishCurrentRun
.
Pracovní prostory jsou standardizovány #4172
Odebrali jsme mnoho konfiguračních možností, abychom zjednodušili konfiguraci spouštěče podle vašich potřeb. Pokud používáte --threads
nebo jiné související parametry, podívejte se na příklady migrace.
--threads
nyní je--pool=threads
.--no-threads
nyní je--pool=forks
.--single-thread
nyní je--poolOptions.threads.singleThread
.--experimental-vm-threads
nyní je--pool=vmThreads
.--experimental-vm-worker-memory-limit
nyní je--poolOptions.vmThreads.memoryLimit
.--isolate
nyní je--poolOptions.<pool-name>.isolate
abrowser.isolate
.test.maxThreads
nyní jetest.poolOptions.<pool-name>.maxThreads
.test.minThreads
nyní jetest.poolOptions.<pool-name>.minThreads
.test.useAtomics
nyní jetest.poolOptions.<pool-name>.useAtomics
.test.poolMatchGlobs.child_process
nyní jetest.poolMatchGlobs.forks
.test.poolMatchGlobs.experimentalVmThreads
nyní jetest.poolMatchGlobs.vmThreads
.
{
scripts: {
- "test": "vitest --no-threads"
// Pro identické chování:
+ "test": "vitest --pool forks --poolOptions.forks.singleFork"
// Nebo multi paralelní forky:
+ "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"
}
}
Změny v pokrytí #4265, #4442
Možnost coverage.all
je nyní ve výchozím nastavení povolena. To znamená, že všechny soubory projektu odpovídající vzoru coverage.include
budou zpracovány, i když nebudou spuštěny.
Tvar API prahových hodnot pokrytí byl upraven a nyní podporuje specifikaci prahových hodnot pro konkrétní soubory pomocí glob vzorců:
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
Několik typů bylo odstraněno a nahrazeno pojmenováním "Mock" ve stylu Jest.
- import { EnhancedSpy, SpyInstance } from 'vitest'
+ import { MockInstance } from 'vitest'
WARNING
SpyInstance
je zastaralý ve prospěch MockInstance
a bude odebrán v příští hlavní verzi.
Napodobování časovačů #3925
vi.useFakeTimers()
již automaticky nemockuje process.nextTick
. Stále je možné mockovat process.nextTick
explicitním specifikováním pomocí vi.useFakeTimers({ toFake: ['nextTick'] })
.
Mockování process.nextTick
však není možné při použití --pool=forks
. Pokud potřebujete mockování process.nextTick
, použijte jinou možnost --pool
.
Migrace z Jest
Vitest byl navržen s API, které je kompatibilní s Jest, aby byla migrace co nejjednodušší. I přes toto úsilí se můžete setkat s následujícími rozdíly:
Globální proměnné jsou ve výchozím nastavení zakázané
Jest má ve výchozím nastavení povoleno globální API. Vitest ne. Můžete buď povolit globální proměnné prostřednictvím nastavení konfigurace globals
, nebo aktualizovat kód tak, aby místo toho používal importy z modulu vitest
.
Pokud se rozhodnete ponechat globální proměnné zakázané, uvědomte si, že běžné knihovny jako testing-library
nebudou automaticky spouštět DOM čištění.
Napodobování modulů
V Jest, při napodobování modulu, je výchozí export návratovou hodnotou argumentu factory. Ve Vitest musí argument factory vrátit objekt, který explicitně definuje každý export. 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',
}));
Další podrobnosti naleznete v sekci API vi.mock
.
Chování automatického napodobování
Na rozdíl od Jest, napodobené moduly v <root>/__mocks__
nejsou načteny, dokud není volána funkce vi.mock()
. Pokud je potřebujete mockovat v každém testu, jako v Jest, můžete je mockovat uvnitř setupFiles
.
Importování originálu napodobovaného balíčku
Pokud pouze částečně napodobujete balíček, je možné, že jste dříve použili 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');
Rozšíření napodobování na externí knihovny
Jest ve výchozím nastavení rozšiřuje mockování na externí knihovny. Pokud chcete, aby se mockování modulu rozšířilo i na jiné externí knihovny, které používají stejný modul, musíte explicitně uvést, které knihovny třetích stran chcete mockovat. Tím zajistíte, že se externí knihovna stane součástí vašeho zdrojového kódu. Použijte k tomu server.deps.inline.
server.deps.inline: ["lib-name"]
Přístup k návratovým hodnotám napodobované Promise
Jak Jest, tak Vitest ukládají výsledky všech mock volání do pole mock.results
. Návratové hodnoty každého volání jsou uloženy ve vlastnosti value
. Pokud však napodobujete nebo špehujete Promise (např. pomocí mockResolvedValue
), v Jest bude vlastnost value
obsahovat Promise, zatímco ve Vitest bude obsahovat vyřešenou hodnotu po vyřešení Promise.
await expect(spy.mock.results[0].value).resolves.toBe(123);
expect(spy.mock.results[0].value).toBe(123);
Proměnné prostředí (Envs)
Stejně jako Jest, Vitest nastaví NODE_ENV
na test
, pokud nebyla nastavena dříve. Vitest má také ekvivalent pro JEST_WORKER_ID
, který se nazývá VITEST_POOL_ID
(vždy menší nebo roven maxThreads
). Pokud na JEST_WORKER_ID
spoléháte, nezapomeňte jej přejmenovat. 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.
Vlastnost Replace
Pokud chcete upravit objekt, použijte replaceProperty API v Jest, můžete použít vi.stubEnv
nebo vi.spyOn
k provedení stejné akce také ve Vitest.
Done Callback
Od verze Vitest v0.10.0 je styl deklarování testů pomocí zpětného volání zastaralý. Můžete je přepsat tak, aby používaly funkce async
/await
, nebo použít Promise k napodobení stylu zpětného volání.
it('should work', (done) => { // [!code --]
it('should work', () => new Promise(done => { // [!code ++]
// ...
done()
}) // [!code --]
})) // [!code ++]
Háky
beforeAll
/beforeEach
háky mohou ve Vitest vracet ukončovací funkci. Proto možná budete muset upravit deklarace háků, pokud vracejí hodnotu jinou než undefined
nebo null
:
beforeEach(() => setActivePinia(createTestingPinia()));
beforeEach(() => {
setActivePinia(createTestingPinia());
});
V Jest se háky volají postupně. Ve výchozím nastavení Vitest spouští háky paralelně. Pokud chcete dosáhnout chování jako v Jest, aktualizujte nastavení sequence.hooks
:
export default defineConfig({
test: {
sequence: {
hooks: 'list',
},
},
});
Typy
Vitest nemá ekvivalent jmenného prostoru jest
. Budete tedy muset importovat typy přímo z vitest
:
let fn: jest.Mock<string, [string]>;
import type { Mock } from 'vitest';
let fn: Mock<[string], string>;
Na rozdíl od Jest, Vitest používá typ Args
jako první argument místo Returns
. Rozdíl je patrný v diffu.
Časovače
Vitest nepodporuje starší časovače Jest.
Časový limit (Timeout)
Pokud jste používali jest.setTimeout
, budete muset migrovat na vi.setConfig
:
jest.setTimeout(5_000);
vi.setConfig({ testTimeout: 5_000 });
Vue Snímky
Ačkoli se nejedná o funkci specifickou pro Jest, pokud jste dříve používali Jest s přednastavením vue-cli, budete muset nainstalovat balíček jest-serializer-vue
a použít jej v souboru 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);
V opačném případě budou vaše snímky obsahovat velké množství escapovaných znaků "
.