使用 Mirage 在 React Native Testing Library 中模擬 API 請求

使用您的 Mirage 伺服器,透過 @testing-library/react-nativeJest NativeJest Expo,在不同的伺服器情境下測試您的 React Native 應用程式。

本指南假設您的應用程式已設定好 React Native Testing Library、Jest Native 和 Expo。它也應該適用於 react-test-rendererreact-native-testing-library

步驟 1:安裝 Mirage

首先,請確保您已安裝 Mirage

# Using npm
npm install --save-dev miragejs

# Using Yarn
yarn add --dev miragejs

步驟 2:設定您的測試環境

我們需要更新我們的 Jest 環境以使用 Mirage。

首先,安裝 XMLHttpRequest 的 polyfill

# Using npm
npm install --save-dev xmlhttprequest

# Using Yarn
yarn add --dev xmlhttprequest

然後在您的專案根目錄中建立一個新的 jest.setup.js 檔案。我們將使用此檔案來修補 global 變數,並新增對 XMLHttpRequest、self 和 window 的支援。

// jest.setup.js
global.self = global
global.window = {}
global.XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest

最後,讓 Jest 使用 jest.config.js 載入我們剛建立的環境。

// jest.config.js
const jestPreset = require("@testing-library/react-native/jest-preset")

module.exports = {
  preset: "jest-expo",
  setupFiles: [...jestPreset.setupFiles],
  setupFilesAfterEnv: ["./jest.setup.js"],
}

在這裡,我們告訴 Jest 在設定測試環境後執行我們的 jest.setup.js

步驟 3:在測試中建立 Mirage 伺服器

在測試檔案中,從 Mirage 匯入 Server,建立一個伺服器,並模擬您的程式碼所依賴的 API 端點

// App.test.js
import React from "react"
import { render, waitForElement } from "@testing-library/react-native"
import App from "../App"
import { createServer } from "miragejs"

let server

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

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

it("shows the users from our server", async () => {
  server.get("/users", () => [
    { id: 1, name: "Luke" },
    { id: 2, name: "Leia" },
  ])

  const { getByTestId } = render(<App />)
  await waitForElement(() => getByTestId("user-1"))
  await waitForElement(() => getByTestId("user-2"))

  expect(getByTestId("user-1")).toHaveTextContent("Luke")
  expect(getByTestId("user-2")).toHaveTextContent("Leia")
})

<App /> 元件呈現並向 /users 發出網路請求時,Mirage 將會攔截並使用上述資料回應。

請注意,我們在每個測試後都呼叫了 server.shutdown(),以便 Mirage 有機會清理自己,而不會洩漏到其他測試中。


如需更完整的範例,請查看 GitHub 上的 Mirage React Native 示範

若要了解 Mirage 強大的測試功能,請閱讀應用程式測試指南