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
相关产品推荐
相关产品推荐

