Mocking af composables, stores og API'er
vi.mock(), mocking af useFetch, mocking af Pinia-stores og mocking af routeren i tests
Mocking af composables, stores og API'er er en gratis Vue Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Vue Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Vue Academy-kurset indeholder 4 lektioner i alt.
Hvorfor bruge mocks?
Enhedstests bør isolere komponenten under test. Rigtige netværkskald, rigtige stores og tunge composables gør tests langsomme og ustabile. Mocking erstatter disse afhængigheder med kontrollerbare testdubleter.
vi.fn: En mock-funktion
vi.fn() opretter en sporet funktion. Du kan undersøge, hvordan den blev kaldt, og styre, hvad den returnerer. Det er grundlaget for al mocking.
import { vi } from "vitest"
const onSave = vi.fn()
onSave("draft")
expect(onSave).toHaveBeenCalledWith("draft")
expect(onSave).toHaveBeenCalledTimes(1)Angiv returværdier
Styr en mocks resultat med mockReturnValue (synkront) eller mockResolvedValue (et opfyldt promise) i asynkron kode.
const getId = vi.fn().mockReturnValue(42)
expect(getId()).toBe(42)
const fetchUser = vi.fn().mockResolvedValue({ name: "Ada" })
// await fetchUser() => { name: "Ada" }Mocking af et composable-modul
vi.mock(path) erstatter et helt modul. Angiv en factory, der returnerer falske eksporter. Brug den til at stubbe en composable, så komponenten får forudsigelige data.
import { vi } from "vitest"
vi.mock("@/composables/useUser", () => ({
useUser: () => ({
user: { value: { name: "Ada" } },
isLoading: { value: false },
}),
}))vi.mock løftes til toppen
Kald til vi.mock løftes til toppen af filen, før importer køres. Derfor kan factoryen ikke referere til ydre variable, der defineres senere — erklær hjælpefunktioner inde i factoryen eller via vi.hoisted.
// This runs before imports regardless of position.
vi.mock("@/api", () => ({ getPosts: vi.fn() }))
import { getPosts } from "@/api" // already the mockTest af Pinia-stores
Komponenter, der bruger en Pinia-store, skal have en store i tests. @pinia/testing leverer createTestingPinia, som giver dig en store, hvis handlinger som standard er mockede.
// terminal: npm install -D @pinia/testing
import { createTestingPinia } from "@pinia/testing"Installér test-Pinia
Send test-Pinia gennem den globale plugins-indstilling, når du monterer. Du kan også angive en starttilstand.
import { mount } from "@vue/test-utils"
import { createTestingPinia } from "@pinia/testing"
const wrapper = mount(Profile, {
global: {
plugins: [createTestingPinia({
initialState: { user: { name: "Ada" } },
})],
},
})Kontrollér store-handlinger
Som standard er handlinger stubbet og bliver ikke kørt, så du kan kontrollere, at de blev udløst. Hent storen, og kontrollér spy'et.
import { useUserStore } from "@/stores/user"
const store = useUserStore()
await wrapper.get("button.logout").trigger("click")
expect(store.logout).toHaveBeenCalled()Spionér på fetch
I stedet for at erstatte et helt modul kan du spionere på en global funktion. vi.spyOn(global, "fetch") ombryder den rigtige fetch, så du kan tilsidesætte og undersøge den.
const spy = vi.spyOn(global, "fetch").mockResolvedValue({
ok: true,
json: async () => ({ items: [1, 2, 3] }),
})En komplet test af fetch
Mock fetch, udløs handlingen, få promises til at blive færdige, og kontrollér de viste data samt at fetch blev kaldt med den korrekte URL.
it("loads items", async () => {
vi.spyOn(global, "fetch").mockResolvedValue({
ok: true,
json: async () => ({ items: ["a", "b"] }),
})
const wrapper = mount(List)
await flushPromises()
expect(global.fetch).toHaveBeenCalledWith("/api/items")
expect(wrapper.findAll("li")).toHaveLength(2)
})Nulstil mocks mellem tests
Fælles mocks samler historik over kald. Nulstil dem i beforeEach (eller aktivér clearMocks i konfigurationen), så én test ikke påvirker en anden.
import { beforeEach, vi } from "vitest"
beforeEach(() => {
vi.clearAllMocks()
})Hurtigt tjek
Kontrollér din forståelse af mocking.
Opsummering
Du har lært at mocke afhængigheder i tests:
vi.fn()opretter sporede funktioner; styr resultatet medmockReturnValue/mockResolvedValue.vi.mock(path, factory)erstatter et modul, f.eks. en composable; kaldet løftes over importer.createTestingPiniafra@pinia/testingleverer en store med stubbede handlinger, som du kan kontrollere.vi.spyOn(global, "fetch").mockResolvedValue(...)simulerer netværkskald.- Nulstil mocks mellem tests med
vi.clearAllMocks().
Lær HTML med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 42
- Lektioner
- 156
Ofte stillede spørgsmål
Er lektionen “Mocking af composables, stores og API'er” gratis?
Ja — alle 3 lektioner i læringssporet Vue Academy, inklusive “Mocking af composables, stores og API'er”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Vue Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Mocking af composables, stores og API'er”?
vi.mock(), mocking af useFetch, mocking af Pinia-stores og mocking af routeren i tests Du øver dig i Vue Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Vue Academy?
Der kræves ingen tidligere erfaring. Vue Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.
Hvor lang tid tager lektionen “Mocking af composables, stores og API'er”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Vue Academy-lektion?
Ja. Alle Vue Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Opsætning af Vitest til Vue-projekter
- Montering og forespørgsler på komponenter
- Test af brugerinteraktioner og hændelser
- Mocking af composables, stores og API'er