整合與單元測試

雖然 Mirage 最初是為接受度測試而設計,但它在編寫整合和單元測試時也非常好用。

重複使用您的全域伺服器

假設您有一個資料提取元件,並且想要編寫一個測試來驗證其行為。

您可以使用先前指南中涵蓋的 startMirage 慣例,並根據您的全域伺服器定義來測試您的元件,就像在應用程式測試中一樣。

// UserTable.test.js
import UserTable from "./UserTable"
import { startMirage } from "./mirage"

let server

beforeEach(() => {
  server = startMirage()
})

afterEach(() => {
  server.shutdown()
})

it("fetches the list of countries", async () => {
  server.createList("user", 5)

  const { getByTestId } = render(<UserTable />)

  await waitForElement(() => getByTestId("users"))

  expect(getByTestId("user-row")).toHaveLength(5)
})

建立一次性伺服器

您也可以建立新的、一次性的 Mirage 伺服器,僅用於測試您的元件。這對於元件庫或可重複使用的資料提取元件,甚至用於測試資料提取鉤子都非常有效。

// useQuery.test.js
import { createServer, Model } from "miragejs"
import React from "react"
import { useQuery } from "./useQuery"

function Movies() {
  const { data } = useQuery("get", "/api/movies")

  return (
    <>
      <h1>Movies</h1>
      {data.movies.map((movie) => (
        <p key={movie.id} data-testid="movie">
          {movie.title}
        </p>
      ))}
    </>
  )
}

let server

beforeEach(() => {
  server = createServer({
    environment: "test",
    models: {
      movie: Model,
    },
    routes() {
      this.namespace = "api"

      this.resource("movie")
    },
  })
})

afterEach(() => {
  server.shutdown()
})

it("can fetch data", async () => {
  server.createList("movie", 5)

  const { getByTestId } = render(<Movies />)

  await findByText("Movies")

  expect(getAllByTestId("movie")).toHaveLength(5)
})

現在您知道如何測試任何依賴網路的事物,從單一元件到整個應用程式!

接下來,我們將討論一些針對 Mirage 模擬伺服器進行斷言的常見方法。