javascript / expert
Snippet
Testen von Vue-Composables mittels Subklassen-Mocking und Dependency Injection
Die Kombination von OOP-Vererbung mit Vue Composition API Composables ermöglicht eine nahtlose Dependency Injection in Unit-Tests. Durch die Übergabe von Mock-Subklassen in Composables können Entwickler die reaktive Zustandsauflösung ohne globales Monkey-Patching testen.
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
import { ref } from 'vue';import { describe, it, expect } from 'vitest';export class BaseApiClient {async fetchData(): Promise<string[]> {return ['real-prod-data'];}}export class MockApiClient extends BaseApiClient {override async fetchData(): Promise<string[]> {return ['mock-alpha', 'mock-beta'];}}export function useDataFetcher(client = new BaseApiClient()) {const data = ref<string[]>([]);const load = async () => { data.value = await client.fetchData(); };return { data, load };}describe('useDataFetcher composable', () => {it('populates reactive state using injected mock class', async () => {const { data, load } = useDataFetcher(new MockApiClient());await load();expect(data.value).toEqual(['mock-alpha', 'mock-beta']);});});
vue
Erklärung
1
export class MockApiClient extends BaseApiClient
Erstellt eine Test-Mock-Subklasse, die von der Basis-API-Client-Klasse erbt.
2
export function useDataFetcher(client = new BaseApiClient())
Definiert ein Vue-Composable, das eine OOP-Abhängigkeit mit einer Standard-Produktionsinstanz entgegennimmt.
3
const { data, load } = useDataFetcher(new MockApiClient());
Injiziert die Mock-Klasseninstanz während des Testaufbaus in das Composable.
4
expect(data.value).toEqual(['mock-alpha', 'mock-beta']);
Überprüft, ob die Vue-ref ihren Wert asynchron mit Mock-Daten aktualisiert hat.