Skip to content
Vitest 1
Main Navigation LeitfadenAPIKonfigurationFortgeschritten
1.6.1
0.34.6

Deutsch

English
简体中文
繁體中文
Español
Français
Русский
Português – Brasil
日本語
한국어
Italiano
Polski
Türkçe
čeština
magyar

Deutsch

English
简体中文
繁體中文
Español
Français
Русский
Português – Brasil
日本語
한국어
Italiano
Polski
Türkçe
čeština
magyar

Aussehen

Sidebar Navigation

Leitfaden

Warum Vitest

Erste Schritte

Features

Arbeitsbereich

Kommandozeilenschnittstelle

Testfilter

Reporter

Codeabdeckung (Coverage)

Snapshot

Mocking

Typen testen

Vitest UI

Browser-Modus

In-Source-Testing

Testkontext

Testumgebung

Erweiterung von Matchern

IDE-Integration

Debugging

Vergleiche mit anderen Test-Runnern

Migrationsleitfaden

Häufige Fehler

Leistungsverbesserung

API

Test API Referenz

Mock-Funktionen

Vi

expect

expectTypeOf

assert

assertType

Konfiguration

Verwaltung der Vitest-Konfigurationsdatei

Vitest konfigurieren

Auf dieser Seite

Testkontext ​

Inspiriert von Playwright Fixtures ermöglicht der Testkontext von Vitest das Definieren von Hilfsfunktionen, Zuständen und Fixtures, die in Ihren Tests verwendet werden können.

Verwendung ​

Das erste Argument jedes Test-Callbacks ist ein Testkontext.

ts
import { it } from 'vitest';

it('sollte funktionieren', ctx => {
  // gibt den Namen der Testaufgabe aus
  console.log(ctx.task.name);
});

Eingebauter Testkontext ​

context.task ​

Ein Nur-Lese-Objekt, das Metadaten über den aktuellen Test enthält.

context.expect ​

Die expect-API, die mit dem aktuellen Test verbunden ist:

ts
import { it } from 'vitest';

it('Mathe ist einfach', ({ expect }) => {
  expect(2 + 2).toBe(4);
});

Diese API ist nützlich, um Snapshot-Tests parallel auszuführen, da die globale expect-Funktion dies nicht verfolgen kann:

ts
import { it } from 'vitest';

it.concurrent('Mathe ist einfach', ({ expect }) => {
  expect(2 + 2).toMatchInlineSnapshot();
});

it.concurrent('Mathe ist schwer', ({ expect }) => {
  expect(2 * 2).toMatchInlineSnapshot();
});

context.skip ​

Überspringt die Ausführung des aktuellen Tests und markiert ihn als übersprungen:

ts
import { expect, it } from 'vitest';

it('Mathe ist schwer', ({ skip }) => {
  skip();
  expect(2 + 2).toBe(5);
});

Den Testkontext erweitern ​

Vitest bietet zwei verschiedene Möglichkeiten, um den Testkontext zu erweitern.

test.extend ​

WARNING

Diese API ist ab Vitest 0.32.3 verfügbar.

Wie Playwright können Sie diese Methode verwenden, um Ihre eigene test-API mit benutzerdefinierten Fixtures zu definieren und diese wiederzuverwenden.

Beispielsweise erstellen wir zuerst myTest mit den zwei Fixtures todos und archive.

ts
// my-test.ts
import { test } from 'vitest';

const todos = [];
const archive = [];

export const myTest = test.extend({
  todos: async ({ task }, use) => {
    // Richten Sie die Fixture vor jeder Testausführung ein
    todos.push(1, 2, 3);

    // Verwenden Sie den Fixture-Wert
    await use(todos);

    // Fixture bereinigen
    todos.length = 0;
  },
  archive,
});

Dann können wir es importieren und verwenden.

ts
import { expect } from 'vitest';
import { myTest } from './my-test.ts';

myTest('Elemente zu todos hinzufügen', ({ todos }) => {
  expect(todos.length).toBe(3);

  todos.push(4);
  expect(todos.length).toBe(4);
});

myTest('Elemente von todos zu Archiv verschieben', ({ todos, archive }) => {
  expect(todos.length).toBe(3);
  expect(archive.length).toBe(0);

  archive.push(todos.pop()!);
  expect(todos.length).toBe(2);
  expect(archive.length).toBe(1);
});

Wir können auch zusätzliche Fixtures hinzufügen oder bestehende überschreiben, indem wir myTest erweitern.

ts
export const myTest2 = myTest.extend({
  settings: {
    // ...
  },
});

Fixture-Initialisierung ​

Der Vitest-Runner initialisiert Ihre Fixtures intelligent und injiziert sie basierend auf der Verwendung in den Testkontext.

ts
import { test } from 'vitest';

async function todosFn({ task }, use) {
  await use([1, 2, 3]);
}

const myTest = test.extend({
  todos: todosFn,
  archive: [],
});

// todosFn wird nicht aufgerufen
myTest('', () => {});
myTest('', ({ archive }) => {});

// todosFn wird ausgeführt
myTest('', ({ todos }) => {});

WARNING

Wenn Sie test.extend() zusammen mit Fixtures verwenden, sollten Sie immer das Muster der Objekt-Destrukturierung { todos } verwenden, um sowohl in der Fixture-Funktion als auch in der Testfunktion auf den Kontext zuzugreifen.

Automatische Fixture ​

WARNING

Diese Funktion ist seit Vitest 1.3.0 verfügbar.

Vitest unterstützt auch die Tupel-Syntax für Fixtures, sodass Sie Optionen für jede Fixture übergeben können. Sie können sie beispielsweise verwenden, um eine Fixture explizit zu initialisieren, auch wenn sie nicht in Tests verwendet wird.

ts
import { test as base } from 'vitest';

const test = base.extend({
  fixture: [
    async ({}, use) => {
      // Diese Funktion wird ausgeführt
      setup();
      await use();
      teardown();
    },
    { auto: true }, // Als automatische Fixture markieren
  ],
});

test('', () => {});

TypeScript ​

Um Typen für alle benutzerdefinierten Kontexte bereitzustellen, können Sie den Fixture-Typ als Generic übergeben.

ts
interface MyFixtures {
  todos: number[];
  archive: number[];
}

const myTest = test.extend<MyFixtures>({
  todos: [],
  archive: [],
});

myTest('', context => {
  expectTypeOf(context.todos).toEqualTypeOf<number[]>();
  expectTypeOf(context.archive).toEqualTypeOf<number[]>();
});

beforeEach und afterEach ​

Die Kontexte sind für jeden Test unterschiedlich. Sie können innerhalb der beforeEach- und afterEach-Hooks auf sie zugreifen und sie erweitern.

ts
import { beforeEach, it } from 'vitest';

beforeEach(async context => {
  // den Kontext erweitern
  context.foo = 'bar';
});

it('sollte funktionieren', ({ foo }) => {
  console.log(foo); // 'bar'
});

TypeScript ​

Um Typen für alle benutzerdefinierten Kontexte bereitzustellen, können Sie den Typ TestContext erweitern, indem Sie Folgendes hinzufügen:

ts
declare module 'vitest' {
  export interface TestContext {
    foo?: string;
  }
}

Wenn Sie Eigenschaftstypen nur für bestimmte beforeEach-, afterEach-, it- und test-Hooks bereitstellen möchten, können Sie den Typ als Generic übergeben.

ts
interface LocalTestContext {
  foo: string;
}

beforeEach<LocalTestContext>(async context => {
  // typeof context is 'TestContext & LocalTestContext'
  context.foo = 'bar';
});

it<LocalTestContext>('sollte funktionieren', ({ foo }) => {
  // typeof foo is 'string'
  console.log(foo); // 'bar'
});
Pager
Vorherige SeiteIn-Source-Testing
Nächste SeiteTestumgebung

Veröffentlicht unter der MIT-Lizenz.

Copyright (c) 2024 Mithril Contributors

https://v1.vitest.dev/guide/test-context

Veröffentlicht unter der MIT-Lizenz.

Copyright (c) 2024 Mithril Contributors