javascript / intermediate
Snippet
Überprüfen von benutzerdefinierten Events und asynchronem State mit Vitest und Vue Test Utils
Beim Testen asynchroner Vue-Komponenten mit Vue Test Utils und Vitest reihen ausgelöste DOM-Interaktionen Microtasks ein, die reaktive Zustände aktualisieren und benutzerdefinierte Events auslösen. `flushPromises()` löst alle ausstehenden Promises in der Warteschlange auf, was deterministische Prüfungen von emittierten Daten und Deaktivierungszuständen ohne willkürliche Timer ermöglicht.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import { mount, flushPromises } from '@vue/test-utils';import { describe, it, expect, vi } from 'vitest';import AsyncSubmitButton from './AsyncSubmitButton.vue';describe('AsyncSubmitButton.vue', () => {it('emits success payload after asynchronous operation resolves', async () => {const mockApi = vi.fn().mockResolvedValue({ status: 200, id: 'tx-99' });const wrapper = mount(AsyncSubmitButton, {props: { actionHandler: mockApi }});const button = wrapper.find('button');await button.trigger('click');expect(button.attributes('disabled')).toBeDefined();await flushPromises();expect(mockApi).toHaveBeenCalledTimes(1);expect(wrapper.emitted('completed')).toBeTruthy();expect(wrapper.emitted('completed')?.[0]).toEqual([{ status: 200, id: 'tx-99' }]);expect(button.attributes('disabled')).toBeUndefined();});});
vue
Erklärung
1
const mockApi = vi.fn().mockResolvedValue({ status: 200, id: 'tx-99' });
Erstellt einen Vitest-Spy, der eine erfolgreiche asynchrone Netzwerkanfrage simuliert.
2
await button.trigger('click');
Löst ein Klick-Event auf dem gerenderten DOM-Element aus und wartet den Event-Zyklus ab.
3
await flushPromises();
Löst alle noch nicht abgeschlossenen Microtasks und Promises der Komponentenlogik auf.
4
expect(wrapper.emitted('completed')?.[0]).toEqual([{ status: 200, id: 'tx-99' }]);
Stellt sicher, dass das benutzerdefinierte Event genau einmal mit den erwarteten Nutzdaten abgefeuert wurde.