Skip to content
Vitest 1
Main Navigation PrzewodnikAPIKonfiguracjaZaawansowany
1.6.1
0.34.6

Polski

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

Polski

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

Wygląd

Sidebar Navigation

Przewodnik

Dlaczego Vitest

Wprowadzenie

Funkcje

Przestrzeń robocza

Interfejs Linii Poleceń

Filtrowanie Testów

Reportery

Pokrycie kodu

Snapshot

Mockowanie

Testowanie typów

Interfejs użytkownika Vitest

Tryb przeglądarki

Testowanie w kodzie źródłowym

Kontekst Testowy

Środowisko Testowe

Rozszerzanie Matcherów

Integracje z IDE

Debugowanie

Porównania z innymi narzędziami do uruchamiania testów

Przewodnik migracji

Częste błędy

Poprawa wydajności

API

Dokumentacja API Testów

Funkcje Mockujące

Vi

expect

expectTypeOf

assert

assertType

Konfiguracja

Zarządzanie plikiem konfiguracyjnym Vitest

Konfiguracja Vitest

Na tej stronie

Przewodnik migracji ​

Migracja z Vitest 0.34.6 ​

Minimalne wymagania ​

Vitest 1.0 wymaga Vite 5.0 i Node.js 18 lub nowszego.

Wszystkie podpakiety @vitest/* wymagają Vitest w wersji 1.0.

Aktualizacja migawek #3961 ​

Cudzysłowy w migawkach nie są już eskejpowane, a wszystkie migawki używają backticków (`) nawet jeśli ciąg znaków jest jednoliniowy.

  1. Cudzysłowy nie są już eskejpowane:
diff
expect({ foo: 'bar' }).toMatchInlineSnapshot(`
  Object {
-    \\"foo\\": \\"bar\\",
+    "foo": "bar",
  }
`)
  1. Migawki jednoliniowe używają teraz backticków (`) zamiast pojedynczych cudzysłowów ('):
diff
- expect('some string').toMatchInlineSnapshot('"some string"')
+ expect('some string').toMatchInlineSnapshot(`"some string"`)

Wprowadzono również zmiany w pakiecie @vitest/snapshot. Jeśli nie używasz go bezpośrednio, nie musisz niczego zmieniać.

  • Nie musisz już rozszerzać SnapshotClient tylko po to, aby nadpisać metodę equalityCheck: po prostu przekaż ją jako isEqual podczas inicjalizacji instancji.
  • client.setTest został przemianowany na client.startCurrentRun.
  • client.resetCurrent został przemianowany na client.finishCurrentRun.

Pule są ustandaryzowane #4172 ​

Usunęliśmy wiele opcji konfiguracyjnych, aby uprościć dostosowanie programu uruchamiającego do Twoich potrzeb. Zapoznaj się z przykładami migracji, jeśli korzystasz z --threads lub innych powiązanych flag.

  • --threads to teraz --pool=threads
  • --no-threads to teraz --pool=forks
  • --single-thread to teraz --poolOptions.threads.singleThread
  • --experimental-vm-threads to teraz --pool=vmThreads
  • --experimental-vm-worker-memory-limit to teraz --poolOptions.vmThreads.memoryLimit
  • --isolate to teraz --poolOptions.<nazwa_puli>.isolate i browser.isolate
  • test.maxThreads to teraz test.poolOptions.<nazwa_puli>.maxThreads
  • test.minThreads to teraz test.poolOptions.<nazwa_puli>.minThreads
  • test.useAtomics to teraz test.poolOptions.<nazwa_puli>.useAtomics
  • test.poolMatchGlobs.child_process to teraz test.poolMatchGlobs.forks
  • test.poolMatchGlobs.experimentalVmThreads to teraz test.poolMatchGlobs.vmThreads
diff
{
  scripts: {
-    "test": "vitest --no-threads"
     // For identical behaviour:
+    "test": "vitest --pool forks --poolOptions.forks.singleFork"
     // Or multi parallel forks:
+    "test": "vitest --pool forks"

  }
}
diff
{
  scripts: {
-    "test": "vitest --experimental-vm-threads"
+    "test": "vitest --pool vmThreads"
  }
}
diff
{
  scripts: {
-    "test": "vitest --isolate false"
+    "test": "vitest --poolOptions.threads.isolate false"
  }
}
diff
{
  scripts: {
-    "test": "vitest --no-threads --isolate false"
+    "test": "vitest --pool forks --poolOptions.forks.isolate false"
  }
}

Zmiany w pokryciu kodu #4265, #4442 ​

Opcja coverage.all jest teraz domyślnie włączona. Oznacza to, że wszystkie pliki projektu pasujące do wzorca coverage.include będą przetwarzane, nawet jeśli nie są wykonywane.

Zmieniono strukturę API progów pokrycia kodu i obsługuje teraz określanie progów dla określonych plików za pomocą wzorców glob.

diff
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 ​

Kilka typów zostało usuniętych na rzecz nazewnictwa "Mock" zgodnego ze stylem Jest.

diff
- import { EnhancedSpy, SpyInstance } from 'vitest'
+ import { MockInstance } from 'vitest'

WARNING

SpyInstance jest przestarzały na rzecz MockInstance i zostanie usunięty w następnej głównej wersji.

Mockowanie timerów #3925 ​

vi.useFakeTimers() nie mockuje już automatycznie process.nextTick. Można nadal mockować process.nextTick, jawnie określając go za pomocą vi.useFakeTimers({ toFake: ['nextTick'] }).

Jednak mockowanie process.nextTick nie jest możliwe przy użyciu --pool=forks. Użyj innej opcji --pool, jeśli potrzebujesz mockowania process.nextTick.

Migracja z Jest ​

Vitest został zaprojektowany z API kompatybilnym z Jest, aby migracja z Jest była tak prosta, jak to możliwe. Pomimo tych wysiłków, możesz napotkać następujące różnice:

Zmienne globalne jako domyślne ​

Jest ma domyślnie włączone API zmiennych globalnych. Vitest nie. Możesz włączyć zmienne globalne za pomocą ustawienia konfiguracji globals lub zaktualizować kod, aby używać importów z modułu vitest.

Jeśli zdecydujesz się pozostawić zmienne globalne wyłączone, pamiętaj, że popularne biblioteki, takie jak testing-library, nie będą automatycznie uruchamiać czyszczenia DOM.

Mockowanie modułów ​

Podczas mockowania modułu w Jest, wartość zwracana argumentu fabryki jest eksportem domyślnym. W Vitest argument fabryki musi zwracać obiekt z każdym eksportem zdefiniowanym jawnie. Na przykład, następujący jest.mock musiałby zostać zaktualizowany w następujący sposób:

ts
jest.mock('./some-path', () => 'hello'); 
vi.mock('./some-path', () => ({
  default: 'hello', 
})); 

Więcej szczegółów można znaleźć w sekcji API vi.mock.

Zachowanie automatycznego mockowania ​

W przeciwieństwie do Jest, zmockowane moduły w <root>/__mocks__ nie są ładowane, chyba że wywołasz vi.mock(). Jeśli chcesz, aby były mockowane w każdym teście, tak jak w Jest, możesz je mockować wewnątrz setupFiles.

Importowanie oryginału mockowanego pakietu ​

Jeśli mockujesz tylko częściowo pakiet, mogłeś wcześniej używać funkcji requireActual z Jest. W Vitest powinieneś zastąpić te wywołania vi.importActual.

ts
const { cloneDeep } = jest.requireActual('lodash/cloneDeep'); 
const { cloneDeep } = await vi.importActual('lodash/cloneDeep'); 

Rozszerzanie mockowania na biblioteki zewnętrzne ​

Tam, gdzie Jest robi to domyślnie, podczas mockowania modułu i chcąc, aby to mockowanie zostało rozszerzone na inne biblioteki zewnętrzne, które używają tego samego modułu, powinieneś wyraźnie określić, którą bibliotekę zewnętrzną chcesz mockować, aby biblioteka zewnętrzna była częścią Twojego kodu źródłowego, używając server.deps.inline.

server.deps.inline: ["nazwa_biblioteki"]

Dostęp do wartości zwracanych mockowanej obietnicy ​

Zarówno Jest, jak i Vitest przechowują wyniki wszystkich wywołań mock w tablicy mock.results, gdzie wartości zwracane każdego wywołania są przechowywane we właściwości value. Jednak podczas mockowania lub szpiegowania obietnicy (np. za pomocą mockResolvedValue), w Jest właściwość value będzie obietnicą, podczas gdy w Vitest stanie się ona rozwiązaną wartością, gdy obietnica zostanie rozwiązana.

ts
await expect(spy.mock.results[0].value).resolves.toBe(123); 
expect(spy.mock.results[0].value).toBe(123); 

Zmienne środowiskowe ​

Podobnie jak w Jest, Vitest ustawia NODE_ENV na test, jeśli nie został wcześniej ustawiony. Vitest ma również odpowiednik dla JEST_WORKER_ID o nazwie VITEST_POOL_ID (zawsze mniejszy lub równy maxThreads), więc jeśli na nim polegasz, nie zapomnij go zmienić. Vitest udostępnia również VITEST_WORKER_ID, który jest unikalnym identyfikatorem uruchomionego workera - ta liczba nie jest zależna od maxThreads i będzie rosła z każdym utworzonym workerem.

Zastępowanie właściwości ​

Jeśli chcesz zmodyfikować obiekt, używając API replaceProperty w Jest, możesz użyć vi.stubEnv lub vi.spyOn, aby zrobić to samo również w Vitest.

Callback Done ​

Od wersji Vitest v0.10.0 styl deklarowania testów za pomocą callbacków jest przestarzały. Możesz je przepisać, aby używały funkcji async/await lub użyć Promise, aby naśladować styl callback.

it('should work', (done) => {  // [!code --]
it('should work', () => new Promise(done => { // [!code ++]
  // ...
  done()
}) // [!code --]
})) // [!code ++]

Hooki ​

W Vitest hooki beforeAll i beforeEach mogą zwracać funkcję teardown. Z tego powodu możesz potrzebować przepisać deklaracje hooków, jeśli zwracają coś innego niż undefined lub null:

ts
beforeEach(() => setActivePinia(createTestingPinia())); 
beforeEach(() => {
  setActivePinia(createTestingPinia());
}); 

W Jest hooki są wywoływane sekwencyjnie (jeden po drugim). Domyślnie Vitest uruchamia hooki równolegle. Aby użyć zachowania Jest, zaktualizuj opcję sequence.hooks:

ts
export default defineConfig({
  test: {
    sequence: {
      hooks: 'list', 
    }, 
  },
});

Typy ​

Vitest nie ma odpowiednika przestrzeni nazw jest, więc będziesz musiał importować typy bezpośrednio z vitest:

ts
let fn: jest.Mock<string, [string]>; 
import type { Mock } from 'vitest'; 
let fn: Mock<[string], string>; 

Ponadto, Vitest ma typ Args jako pierwszy argument zamiast Returns, jak widać w diff.

Timery ​

Vitest nie obsługuje starszych timerów Jest.

Timeout ​

Jeśli używałeś jest.setTimeout, musisz migrować do vi.setConfig:

ts
jest.setTimeout(5_000); 
vi.setConfig({ testTimeout: 5_000 }); 

Migawki Vue ​

To nie jest funkcja specyficzna dla Jest, ale jeśli wcześniej używałeś Jest z presetem vue-cli, będziesz musiał zainstalować pakiet jest-serializer-vue i użyć go wewnątrz setupFiles:

vite.config.js

js
import { defineConfig } from 'vite';

export default defineConfig({
  test: {
    setupFiles: ['./tests/unit/setup.js'],
  },
});

tests/unit/setup.js

js
import vueSnapshotSerializer from 'jest-serializer-vue';

expect.addSnapshotSerializer(vueSnapshotSerializer);

W przeciwnym razie Twoje migawki będą miały dużo eskejpowanych znaków " .

Pager
Poprzednia stronaPorównania z innymi narzędziami do uruchamiania testów
Następna stronaCzęste błędy

Opublikowano na licencji MIT.

Copyright (c) 2024 Mithril Contributors

https://v1.vitest.dev/guide/migration

Opublikowano na licencji MIT.

Copyright (c) 2024 Mithril Contributors