Egyéni Készlet
WARNING
Ez egy haladó szintű API. Ha csak teszteket futtatsz, valószínűleg nincs szükséged rá. Elsősorban könyvtárszerzők számára készült.
A Vitest a teszteket készletekben futtatja. Alapértelmezés szerint a következő készletek érhetők el:
threads
: a tesztek futtatása anode:worker_threads
használatával (az izolációt egy új worker kontextus biztosítja).forks
: a tesztek futtatása anode:child_process
használatával (az izolációt egy újchild_process.fork
folyamat biztosítja).vmThreads
: a tesztek futtatása anode:worker_threads
használatával (de az izolációt avm
modul biztosítja egy új worker kontextus helyett).browser
: a tesztek futtatása böngésző szolgáltatók használatával.typescript
: a típusellenőrzés futtatása a teszteken.
Megadhatsz saját készletet egy fájl elérési útjával:
import { defineConfig } from 'vitest/config';
// ---cut---
export default defineConfig({
test: {
// Alapértelmezés szerint minden fájlt egyéni készlettel futtat
pool: './my-custom-pool.ts',
// A `poolOptions` objektummal opciókat adhatsz meg
poolOptions: {
myCustomPool: {
customProperty: true,
},
},
// Megadhatsz készletet a fájlok egy részhalmazához is
poolMatchGlobs: [['**/*.custom.test.ts', './my-custom-pool.ts']],
},
});
API
A pool
opcióban megadott fájlnak exportálnia kell egy függvényt (akár aszinkron is lehet), amely első argumentumként elfogadja a Vitest
interfészt. Ennek a függvénynek egy ProcessPool
interfészt implementáló objektumot kell visszaadnia.
import { ProcessPool, WorkspaceProject } from 'vitest/node';
export interface ProcessPool {
name: string;
runTests: (
files: [project: WorkspaceProject, testFile: string][],
invalidates?: string[]
) => Promise<void>;
close?: () => Promise<void>;
}
A függvény csak egyszer kerül meghívásra (hacsak a szerver konfigurációja nem frissül), és általában érdemes a tesztekhez szükséges összes dolgot ebben a függvényben inicializálni, és újra felhasználni, amikor a runTests
meghívásra kerül.
A Vitest meghívja a runTests
függvényt, amikor új teszteket terveznek futtatni. Nem hívja meg, ha a files
üres. Az első argumentum egy tuple-ket tartalmazó tömb: az első elem egy hivatkozás egy munkaterület projektre, a második pedig egy abszolút elérési út egy tesztfájlhoz. A fájlok a sequencer
segítségével vannak rendezve a runTests
meghívása előtt. Lehetséges (de valószínűtlen), hogy ugyanaz a fájl kétszer szerepel, de mindig más projekthez tartozik - ezt a vitest.workspace.ts
konfiguráció biztosítja.
A Vitest vár a runTests
befejeződésére, mielőtt befejezi a futtatást (azaz csak a runTests
feloldása után küldi el az onFinished
eseményt).
Ha egyéni készletet használsz, neked kell megadnod a tesztfájlokat és azok eredményeit - ehhez hivatkozhatsz a vitest.state
fájlra (közülük a collectFiles
és az updateTasks
a legfontosabbak). A Vitest a @vitest/runner
csomag startTests
függvényét használja ehhez.
A különböző folyamatok közötti kommunikációhoz a vitest/node
fájlból származó createMethodsRPC
segítségével létrehozhatsz egy metódusok objektumát, és használhatsz bármilyen tetszőleges kommunikációs módot. Például, ha WebSockets-et szeretnél használni a birpc
-vel, írhatod a következő módon:
import { createBirpc } from 'birpc';
import { parse, stringify } from 'flatted';
import { WorkspaceProject, createMethodsRPC } from 'vitest/node';
function createRpc(project: WorkspaceProject, wss: WebSocketServer) {
return createBirpc(createMethodsRPC(project), {
post: msg => wss.send(msg),
on: fn => wss.on('message', fn),
serialize: stringify,
deserialize: parse,
});
}
Annak érdekében, hogy minden tesztet begyűjtsenek, meghívhatod a ctx.state.collectFiles
függvényt, és értesítheted a Vitest riportereket:
async function runTests(project: WorkspaceProject, tests: string[]) {
// ... tesztek futtatása, elhelyezése a "files"-ba és a "tasks"-ba
const methods = createMethodsRPC(project);
await methods.onCollected(files);
// A legtöbb riporter az "onTaskUpdate" eseményben frissülő eredményekre támaszkodik
await methods.onTaskUpdate(tasks);
}
Egy egyszerű példát láthatsz a pool/custom-pool.ts fájlban.