Vue Academy · Lektion

Mocking af composables, stores og API'er

vi.mock(), mocking af useFetch, mocking af Pinia-stores og mocking af routeren i tests

Lektion 4 af 413 trin

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 mock

Test 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 med mockReturnValue / mockResolvedValue.
  • vi.mock(path, factory) erstatter et modul, f.eks. en composable; kaldet løftes over importer.
  • createTestingPinia fra @pinia/testing leverer en store med stubbede handlinger, som du kan kontrollere.
  • vi.spyOn(global, "fetch").mockResolvedValue(...) simulerer netværkskald.
  • Nulstil mocks mellem tests med vi.clearAllMocks().
Gratis at komme i gang

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

  1. Opsætning af Vitest til Vue-projekter
  2. Montering og forespørgsler på komponenter
  3. Test af brugerinteraktioner og hændelser
  4. Mocking af composables, stores og API'er
← Tilbage til Vue Academy