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
SnapshotClientpouze proto, abyste přepsali metoduequalityCheck: stačí ji předat jakoisEqualpři inicializaci instance. client.setTestbyl přejmenován naclient.startCurrentRun.client.resetCurrentbyl 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.
--threadsnyní je--pool=threads.--no-threadsnyní je--pool=forks.--single-threadnyní je--poolOptions.threads.singleThread.--experimental-vm-threadsnyní je--pool=vmThreads.--experimental-vm-worker-memory-limitnyní je--poolOptions.vmThreads.memoryLimit.--isolatenyní je--poolOptions.<pool-name>.isolateabrowser.isolate.test.maxThreadsnyní jetest.poolOptions.<pool-name>.maxThreads.test.minThreadsnyní jetest.poolOptions.<pool-name>.minThreads.test.useAtomicsnyní jetest.poolOptions.<pool-name>.useAtomics.test.poolMatchGlobs.child_processnyní jetest.poolMatchGlobs.forks.test.poolMatchGlobs.experimentalVmThreadsnyní 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) => {
it('should work', () => new Promise(done => {
// ...
done()
})
})) 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ů ".