You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MSW模拟响应返回undefined,React测试意外使用真实API数据

MSW模拟响应返回undefined,React测试意外使用真实API数据

我看你现在遇到的问题是MSW的模拟响应没生效,测试的时候反而调用了真实的randomuser.me API,拿到了真实数据对吧?仔细排查你的代码,主要有两个地方需要修正:

1. Mock数据结构与响应返回错误

你的handler.js里,mock数据的结构和返回方式都和真实API不匹配:

  • 真实的randomuser.me API返回的响应体直接是{results: [...]},而你定义的mockResponse多套了一层data
  • 并且你在返回的时候又把mockResponse包进了一个新对象{mockResponse},最终返回的结构变成了{mockResponse: {data: {results: [...]}}}

这样组件里axios.get拿到的data就是这个嵌套错误的对象,data.results自然是undefined,导致组件初始渲染时没有数据,最终真实API的请求趁机生效。

修正handler.js的代码:

import { rest } from 'msw';

// 直接和真实API响应体结构保持一致
const mockResponse = {
  results: [
    {
      name: {
        first: "first",
        last: "last",
      },
      login: {
        username: "x",
      },
    },
  ],
};

export const handlers = [
  rest.get('https://randomuser.me/api/', (req, res, ctx) => {
    // 直接返回正确结构的mock数据
    return res(ctx.json(mockResponse))
  })
]

2. 未在测试中启动MSW服务器

你的测试文件FollowersList.test.js里没有初始化MSW的服务器,这会导致MSW根本没拦截请求,直接走了真实API。必须在测试生命周期中启动和关闭MSW服务:

修正测试文件的代码:

import { render, screen } from "@testing-library/react";
import { BrowserRouter } from "react-router-dom";
import FollowersList from "../FollowersList";
// 导入MSW的服务器工具
import { setupServer } from 'msw/node'
import { handlers } from '../src/mock/handler'

// 创建MSW服务器
const server = setupServer(...handlers)

// 测试前启动服务器
beforeAll(() => server.listen())
// 每个测试后重置handler,避免测试间污染
afterEach(() => server.resetHandlers())
// 测试结束后关闭服务器
afterAll(() => server.close())

const MockFollowersList = () => {
  return (
    <BrowserRouter>
      <FollowersList />
    </BrowserRouter>
  );
};

describe("FollowersList Component", () => {
  test("renders first follower with mock data", async () => {
    render(<MockFollowersList />);
    // 可以验证mock的名字是否正确渲染
    expect(await screen.findByText("first last")).toBeInTheDocument();
    expect(await screen.findByTestId("follower-item-0")).toBeInTheDocument();
  });
});

额外验证点

  • 确认你的MSW依赖已经正确安装(npm install msw --save-dev)
  • 如果你的组件请求URL带有query参数(比如?results=5),MSW默认会忽略query参数进行匹配,所以当前的rest.get('https://randomuser.me/api/')是可以匹配到的,如果需要严格匹配,可以在handler里判断req.url.searchParams.get('results')

这样修改后,测试就会正确使用MSW的mock数据,不会再请求真实API了。

备注:内容来源于stack exchange,提问作者Suhas Rao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:12:57