Migrálási útmutató
Migrálás Vitest 0.34.6-ról
Minimális követelmények
A Vitest 1.0 Vite 5.0-át és Node.js 18 vagy újabb verziót igényel.
Az összes @vitest/* alcsomaghoz Vitest 1.0 verzió szükséges.
Pillanatképek frissítése #3961
A pillanatfelvételekben az idézőjelek már nincsenek escape-elve, és minden pillanatfelvétel backtick (`) idézőjeleket használ, még akkor is, ha a szöveg csak egyetlen sor.
- Az idézőjelek már nincsenek escape-elve:
expect({ foo: 'bar' }).toMatchInlineSnapshot(`
Object {
- \\"foo\\": \\"bar\\",
+ "foo": "bar",
}
`)- Az egysoros pillanatfelvételek most "`" idézőjeleket használnak a ':' helyett:
- expect('some string').toMatchInlineSnapshot('"some string"')
+ expect('some string').toMatchInlineSnapshot(`"some string"`)A @vitest/snapshot csomagban is történtek változások. Ha nem használod közvetlenül, nem szükséges módosítanod semmit.
- Már nem kell kiterjesztened a
SnapshotClient-et csak azért, hogy felülírd azequalityCheckmetódust: csak add átisEqualparaméterként a példányosításkor. - A
client.setTestátnevezveclient.startCurrentRun-ra - A
client.resetCurrentátnevezveclient.finishCurrentRun-ra
A pool-ok szabványosítva #4172
Eltávolítottunk sok konfigurációs opciót, hogy könnyebben konfigurálhasd a tesztkörnyezetet az igényeidnek megfelelően. Kérlek, nézd meg a migrációs példákat, ha a --threads vagy más kapcsolódó kapcsolókra támaszkodsz.
- A
--threadsmost--pool=threads - A
--no-threadsmost--pool=forks - A
--single-threadmost--poolOptions.threads.singleThread - A
--experimental-vm-threadsmost--pool=vmThreads - A
--experimental-vm-worker-memory-limitmost--poolOptions.vmThreads.memoryLimit - Az
--isolatemost--poolOptions.<pool-name>.isolateésbrowser.isolate - A
test.maxThreadsmosttest.poolOptions.<pool-name>.maxThreads - A
test.minThreadsmosttest.poolOptions.<pool-name>.minThreads - A
test.useAtomicsmosttest.poolOptions.<pool-name>.useAtomics - A
test.poolMatchGlobs.child_processmosttest.poolMatchGlobs.forks - A
test.poolMatchGlobs.experimentalVmThreadsmosttest.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"
}
}Változások a lefedettségben #4265, #4442
A coverage.all opció jelenleg alapértelmezés szerint engedélyezve van. Ez azt jelenti, hogy a coverage.include mintára illeszkedő összes projektfájl feldolgozásra kerül, még akkor is, ha nem futnak le a tesztek során.
Megváltozott a lefedettségi küszöbértékek API-ja, amely mostantól támogatja a küszöbértékek glob mintákkal történő megadását konkrét fájlokhoz.
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,
+ }
}
}
})Mock típusok változása #4400
Eltávolítottunk néhány típust a Jest-stílusú "Mock" elnevezés egységesítése érdekében.
- import { EnhancedSpy, SpyInstance } from 'vitest'
+ import { MockInstance } from 'vitest'WARNING
A SpyInstance elavult a MockInstance javára, és a következő fő verzióban el lesz távolítva.
Időzítő mock-ok #3925
A vi.useFakeTimers() mostantól nem helyettesíti automatikusan a process.nextTick működését. Továbbra is lehetséges a process.nextTick mock-olása, ha explicit módon megadod a vi.useFakeTimers({ toFake: ['nextTick'] }) használatával.
Azonban a process.nextTick helyettesítése nem lehetséges a --pool=forks használatakor. Használj másik --pool opciót, ha szükséged van a process.nextTick funkcióra.
Migrálás Jest-ről
A Vitest a Jest API-jával való kompatibilitásra lett tervezve, hogy a Jest-ről való átállás minél egyszerűbb legyen. Ennek ellenére a következő különbségek merülhetnek fel:
Globális változók alapértelmezettként
A Jest-nek alapértelmezés szerint engedélyezve van a globális API. A Vitest-nek nincs. Engedélyezheted a globális változókat a globals konfigurációs beállításon keresztül, vagy frissítheted a kódot, hogy a vitest modulból importáljon.
Ha a globális változók használata helyett a modul importálást választod, vedd figyelembe, hogy a gyakori könyvtárak, mint például a testing-library, nem fogják automatikusan futtatni a DOM cleanup funkciót.
Modulok mock-olása
Jest esetén egy modul helyettesítésekor a factory argumentum visszatérési értéke az alapértelmezett export lesz. Vitest esetén a factory argumentumnak egy objektumot kell visszaadnia, amelyben minden export explicit módon definiált. Például a következő jest.mock-ot a következőképpen kell frissíteni:
jest.mock('./some-path', () => 'hello');
vi.mock('./some-path', () => ({
default: 'hello',
})); További részletekért kérlek, tekintsd meg a vi.mock API szekciót.
Automatikus Mock-olási viselkedés
Eltérően a Jest-től, a <root>/__mocks__ mappában található helyettesítő modulok nem töltődnek be automatikusan, csak a vi.mock() meghívásakor. Ha azt szeretnéd, hogy minden tesztben mock-olva legyenek, mint a Jest-ben, akkor mock-olhatod őket a setupFiles belsejében.
Mock-olt csomag eredetijének importálása
Ha egy csomagot csak részlegesen helyettesítesz, a Jest-ben a requireActual függvényt használhattad. Vitest-ben ezeket a hívásokat a vi.importActual-ra kell cserélned.
const { cloneDeep } = jest.requireActual('lodash/cloneDeep');
const { cloneDeep } = await vi.importActual('lodash/cloneDeep'); A mock-olás kiterjesztése külső könyvtárakra
Jest esetén ez alapértelmezett viselkedés. Ha egy modul helyettesítését ki szeretnéd terjeszteni más, ugyanazt a modult használó külső könyvtárakra is, explicit módon meg kell adnod, mely külső könyvtárakra vonatkozzon a helyettesítés. Ehhez a server.deps.inline beállítást kell használnod, hogy a külső könyvtár a forráskódod részévé váljon.
server.deps.inline: ["lib-name"]A mock-olt Promise visszatérési értékeinek elérése
Mind a Jest, mind a Vitest a mock.results tömbben tárolja a helyettesítő hívások eredményeit, ahol az egyes hívások visszatérési értékei a value tulajdonságban találhatók. Ha egy Promise-t helyettesítesz vagy figyelsz (pl. a mockResolvedValue használatával), Jest esetén a value tulajdonság egy Promise lesz, míg Vitest esetén a Promise feloldásakor a value tulajdonság a feloldott értéket fogja tartalmazni.
await expect(spy.mock.results[0].value).resolves.toBe(123);
expect(spy.mock.results[0].value).toBe(123); Környezeti változók
A Jest-hez hasonlóan a Vitest is test-re állítja a NODE_ENV környezeti változót, ha az korábban nem volt beállítva. A JEST_WORKER_ID környezeti változónak a Vitest-ben a VITEST_POOL_ID felel meg (melynek értéke mindig kisebb vagy egyenlő, mint a maxThreads). Ha erre támaszkodsz, ne felejtsd el átnevezni. A Vitest emellett elérhetővé teszi a VITEST_WORKER_ID környezeti változót is, amely egy futó worker egyedi azonosítója. Ennek az értékét nem befolyásolja a maxThreads, és minden létrehozott workerrel növekszik.
Tulajdonság cseréje
Ha egy objektum tulajdonságát szeretnéd módosítani, Jest esetén a replaceProperty API-t használhatod. Vitest-ben a vi.stubEnv vagy a vi.spyOn függvényekkel érheted el ugyanezt.
Done Callback
A Vitest v0.10.0 verziójától kezdve a tesztek callback stílusú deklarálása elavultnak minősül. Javasolt az async/await függvények használata, vagy a callback stílus Promise-ekkel való helyettesítése.
it('should work', (done) => {
it('should work', () => new Promise(done => {
// ...
done()
})
})) Hook-ok
A beforeAll/beforeEach hook-ok Vitest-ben teardown függvényt adhatnak vissza. Emiatt szükség lehet a hook deklarációk módosítására, ha azok undefined vagy null értéktől eltérő értéket adnak vissza.
beforeEach(() => setActivePinia(createTestingPinia()));
beforeEach(() => { setActivePinia(createTestingPinia()) }); Jest esetén a hook-ok szekvenciálisan (egymás után) futnak le. Ezzel szemben a Vitest alapértelmezés szerint párhuzamosan futtatja a hook-okat. A Jest viselkedésének eléréséhez módosítsd a sequence.hooks opciót.
export default defineConfig({
test: {
sequence: {
hooks: 'list',
},
},
});Típusok
A Vitest nem rendelkezik a Jest jest névterének megfelelőjével, ezért a típusokat közvetlenül a vitest modulból kell importálnod.
let fn: jest.Mock<string, [string]>;
import type { Mock } from 'vitest';
let fn: Mock<[string], string>; A Vitest-ben az Args típus az első argumentum a Returns helyett, ahogy az a diff-ben is látható.
Időzítők
A Vitest nem támogatja a Jest régi időzítőit.
Időtúllépés
Ha a jest.setTimeout-ot használtad, akkor át kell migrálnod a vi.setConfig-ra:
jest.setTimeout(5_000);
vi.setConfig({ testTimeout: 5_000 }); Vue Pillanatképek
Ez nem egy Jest-specifikus funkció, de ha korábban a Jest-et a vue-cli preset-tel használtad, telepítened kell a jest-serializer-vue csomagot, és be kell állítanod a setupFiles fájlban:
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);Ellenkező esetben a pillanatfelvételekben sok escape-elt " karakter fog szerepelni.