Migrationshandbuch
Migration von Jest zu Vitest
Vitest wurde mit einer Jest-kompatiblen API entwickelt, um die Migration von Jest so einfach wie möglich zu gestalten. Trotz dieser Bemühungen können dennoch folgende Unterschiede auftreten:
Globale APIs standardmäßig
Jest hat seine globale API standardmäßig aktiviert. Vitest hingegen nicht. Sie können entweder globale APIs über die Konfigurationseinstellung globals
aktivieren oder Ihren Code aktualisieren, um stattdessen Importe aus dem Modul vitest
zu verwenden.
Wenn Sie globale Variablen deaktiviert lassen, beachten Sie, dass gängige Bibliotheken wie testing-library
kein automatisches DOM-Cleanup durchführen.
Modul-Mocks
Beim Simulieren eines Moduls in Jest ist der Rückgabewert des Factory-Arguments der Standardexport. In Vitest muss das Factory-Argument ein Objekt zurückgeben, in dem jeder Export explizit definiert ist. Beispielsweise müsste der folgende jest.mock
-Aufruf wie folgt aktualisiert werden:
- jest.mock('./some-path', () => 'hello')
+ vi.mock('./some-path', () => ({
+ default: 'hello',
+ })
Weitere Informationen finden Sie im Abschnitt zur vi.mock
-API.
Automatisches Mocking-Verhalten
Im Gegensatz zu Jest werden gemockte Module in <root>/__mocks__
nicht geladen, es sei denn, vi.mock()
wird aufgerufen. Wenn Sie möchten, dass sie in jedem Test gemockt werden, wie in Jest, können Sie sie in setupFiles
mocken.
Importieren des Originals eines gemockten Pakets
Wenn Sie ein Paket nur teilweise mocken, haben Sie möglicherweise zuvor die Jest-Funktion requireActual
verwendet. In Vitest sollten Sie diese Aufrufe durch vi.importActual
ersetzen.
- const { cloneDeep } = jest.requireActual('lodash/cloneDeep')
+ const { cloneDeep } = await vi.importActual('lodash/cloneDeep')
Umgebungsvariablen
Genau wie Jest setzt Vitest NODE_ENV
auf test
, sofern diese Variable nicht bereits gesetzt ist. Vitest hat auch ein Gegenstück für JEST_WORKER_ID
namens VITEST_POOL_ID
(immer kleiner oder gleich maxThreads
). Wenn Sie sich darauf verlassen, vergessen Sie nicht, es umzubenennen. Vitest stellt auch VITEST_WORKER_ID
bereit, eine eindeutige ID eines laufenden Workers - diese Zahl wird von maxThreads
nicht beeinflusst und erhöht sich mit jedem erstellten Worker.
Wenn Sie die Umgebungsvariablen ändern möchten, konnten Sie in Jest die replaceProperty API benutzen. In Vitest können Sie dies auch mit vi.stubEnv tun.
Done Callback
Ab Vitest v0.10.0 ist die Callback-Methode zum Deklarieren von Tests nicht mehr empfohlen. Sie können sie umschreiben, um async
/await
-Funktionen zu verwenden, oder Promise verwenden, um den Callback-Stil zu imitieren.
- it('should work', (done) => {
+ it('should work', () => new Promise(done => {
// ...
done()
- })
+ }))
Hooks
beforeAll
/beforeEach
-Hooks können in Vitest eine Aufräumfunktion zurückgeben. Aus diesem Grund müssen Sie möglicherweise Ihre Hook-Deklarationen umschreiben, wenn sie etwas anderes als undefined
oder null
zurückgeben:
- beforeEach(() => setActivePinia(createTestingPinia()))
+ beforeEach(() => { setActivePinia(createTestingPinia()) })
Typen
Vitest stellt nicht viele Typen im Vi
-Namespace bereit. Er existiert hauptsächlich zur Kompatibilität mit Matchern, sodass Sie Typen möglicherweise direkt aus vitest
importieren müssen, anstatt sich auf den Vi
-Namespace zu verlassen:
- let fn: jest.Mock<string, [string]>
+ import type { Mock } from 'vitest'
+ let fn: Mock<[string], string>
Zudem verwendet Vitest den Typ Args
als erstes Argument anstelle von Returns
, wie im Diff dargestellt.
Timer
Vitest unterstützt die Legacy-Timer von Jest nicht.
Vue Snapshots
Dies ist keine Jest-spezifische Funktion, aber wenn Sie zuvor Jest mit der vue-cli-Voreinstellung verwendet haben, müssen Sie das Paket jest-serializer-vue
installieren und es in setupFiles verwenden:
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);
Andernfalls enthalten Ihre Snapshots viele escaped "
-Zeichen.