Mirage を使った React Native Testing Library でのモック API リクエスト

Mirage サーバーを使用して、@testing-library/react-nativeJest Native、および Jest 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: テスト環境の設定

Mirage で動作するように Jest 環境を更新する必要があります。

まず、XMLHttpRequest のポリフィルをインストールします。

# 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.config.js を使用して、作成した環境を Jest にロードさせます。

// 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 の強力なテスト機能の詳細については、アプリケーションテストガイドをお読みください。