iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0
Modern Web

React 測試 x AI:探索測試新境界,測試不再枯燥乏味!系列 第 17

[Day 17] React + Jest API (MSW) 測試

  • 分享至 

  • xImage
  •  

上篇講了如何在開發上導入 MSW,這篇要來介紹如何在測試上使用 MSW。

測試導入 MSW

首先在 src/mocks 建立一個 server.js 內容跟 browser.js 一樣:

// src/mocks/server.js
import { setupServer } from "msw/node";
import { handlers } from "./handlers";

export const server = setupServer(...handlers);

差別在於 server.js 設置 server 是用 msw/node 給 Node.js 環境使用,browser.js 則是使用 msw 給瀏覽器環境使用。

接著在 src/setupTests.js 引入 server.js

// src/setupTests.js
import "@testing-library/jest-dom";
import { server } from "./mocks/server";

beforeAll(() => server.listen());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());

這邊就是在全域的測試設置中,在每次測試前開啟 server,每次測試後重置 server,最後在所有測試結束後關閉 server,這樣就可以在跑測試時使用 MSW 了!

測試 API

我以 Day14 為範例,在原本的測試中需要自己模擬假資料:

import { render, screen } from "@testing-library/react";
import { useFetchUserData } from "@/api/fetchData";
import { ApiPage } from "./index";

jest.mock("@/api/fetchData");

describe("ApiPage", () => {
  it("當 isLoading 為 false 畫面顯示 data 資料", () => {
    const mockData = [
      { id: 1, name: "John Doe", email: "john.doe@example.com" },
      { id: 2, name: "Jane Smith", email: "jane.smith@example.com" },
    ];
    (useFetchUserData as jest.Mock).mockReturnValue({
      isLoading: false,
      data: mockData,
    });

    render(<ApiPage />);
    mockData.forEach((user) => {
      expect(screen.getByText(user.name)).toBeInTheDocument();
      expect(screen.getByText(user.email)).toBeInTheDocument();
    });
  });
});

使用 MSW 後,可以直接使用寫好的 handler 來模擬假資料:

import { render, screen } from "@testing-library/react";
import { useFetchUserData } from "@/api/fetchData";
import { ApiPage } from "./index";
import { fakerUserList } from "@/mocks/handlers";

jest.mock("@/api/fetchData");

describe("ApiPage", () => {
  it("當 isLoading 為 false 畫面顯示 data 資料", () => {
    // 這邊直接使用 handler 中的假資料
    const mockData = fakerUserList;
    (useFetchUserData as jest.Mock).mockReturnValue({
      isLoading: false,
      data: mockData,
    });

    render(<ApiPage />);
    mockData.forEach((user) => {
      expect(screen.getByText(user.name)).toBeInTheDocument();
      expect(screen.getByText(user.email)).toBeInTheDocument();
    });
  });
});

是不是就方便許多了呢!

結論

不管有沒有在開發上導入 MSW,都可以在測試上做使用,除了可以方便模擬回傳外,也更方便地管理這些假資料。不過個人還是喜歡在開發時一起做使用,這樣得到的成效會更好。


上一篇
[Day 16] MSW 介紹
下一篇
[Day 18] React + Jest API (MSW) 測試 (AI)
系列文
React 測試 x AI:探索測試新境界,測試不再枯燥乏味!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言