javascript / expert
Snippet
Synchronisieren von Svelte 5 Effect-Runen in automatisierten Unit-Tests
In Svelte 5 lösen Zustandsänderungen Reaktivitäts-Batching aus, bei dem `$effect`-Runen asynchron in Microtasks ausgeführt werden. In Unit-Tests schlagen Assertions direkt nach Zustandsänderungen fehl, sofern sie nicht mit Sveltes `tick()`-Funktion synchronisiert werden.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import { tick } from 'svelte';import { expect, test } from 'vitest';import { render } from '@testing-library/svelte';import EffectComponent from './EffectComponent.svelte';test('flushes $effect state mutations asynchronously before DOM assertions', async () => {const { getByTestId } = render(EffectComponent, { props: { initialCount: 0 } });const displayEl = getByTestId('counter-display');expect(displayEl.textContent).toBe('Count: 0');const incrementBtn = getByTestId('increment-btn');incrementBtn.click();await tick();expect(displayEl.textContent).toBe('Count: 1');});
svelte
Erklärung
1
import { tick } from 'svelte';
Importiert Sveltes Kern-Dienstprogramm, das ein Promise zurückgibt, sobald ausstehende Updates verarbeitet sind.
2
incrementBtn.click();
Löst eine Zustandsänderung aus, die reaktive $effect-Updates asynchron einplant.
3
await tick();
Pausiert die Testausführung, bis Svelte alle ausstehenden DOM-Mutationen und Rune-Effekte abgearbeitet hat.
4
expect(displayEl.textContent).toBe('Count: 1');
Prüft den DOM-Textinhalt, nachdem die reaktiven Effekte vollständig synchronisiert wurden.