javascript / intermediate
Snippet
Mocken injizierter asynchroner Service-Verträge in Vitest-Komponententests
Das Testen von Vue-Komponenten mit asynchroner Dependency Injection erfordert das Mocken des bereitgestellten Service-Vertrags über typisierte Symbols. Die Kombination von Vitest-Mocks in den global.provide-Optionen mit flushPromises stellt sicher, dass alle Microtasks und asynchronen Hooks vor DOM-Zusicherungen deterministisch aufgelöst werden.
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
24
25
26
27
28
29
30
31
32
33
import { describe, it, expect, vi } from 'vitest';import { mount, flushPromises } from '@vue/test-utils';import type { InjectionKey } from 'vue';import UserProfile from './UserProfile.vue';interface AuthServiceContract {fetchPermissions(userId: string): Promise<string[]>;}const AUTH_KEY: InjectionKey<AuthServiceContract> = Symbol('AUTH_KEY');describe('UserProfile Async Permissions', () => {it('renders resolved permissions after async injection completes', async () => {const mockAuthService: AuthServiceContract = {fetchPermissions: vi.fn().mockResolvedValue(['read:reports', 'write:drafts'])};const wrapper = mount(UserProfile, {props: { userId: 'usr_42' },global: {provide: {[AUTH_KEY as symbol]: mockAuthService}}});expect(wrapper.text()).toContain('Loading...');await flushPromises();expect(mockAuthService.fetchPermissions).toHaveBeenCalledWith('usr_42');expect(wrapper.findAll('[data-test="perm-item"]')).toHaveLength(2);});});
vue
Erklärung
1
const AUTH_KEY: InjectionKey<AuthServiceContract> = Symbol('AUTH_KEY');
Definiert einen typisierten InjectionKey zur Entkopplung der Komponente von konkreten Implementierungen.
2
fetchPermissions: vi.fn().mockResolvedValue(['read:reports', 'write:drafts'])
Erstellt einen asynchronen Spion, der simulierte Berechtigungs-Claims in einem Promise auflöst.
3
global: { provide: { [AUTH_KEY as symbol]: mockAuthService } }
Injiziert den gemockten Service-Vertrag in die provide-Hierarchie des Test-Wrappers.
4
await flushPromises();
Löst alle ausstehenden asynchronen Microtasks auf, bevor DOM-Zusicherungen geprüft werden.