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

使用Jest/Enzyme和Axios测试React组件

解决React组件测试中Axios网络错误的问题

首先得说清楚:你遇到的网络错误,不是Jest没等组件渲染完才执行请求的问题——Jest的jsdom测试环境本身就不支持真实的网络请求。它只是模拟了浏览器的DOM环境,但没有真实的网络栈,所以直接调用真实接口肯定会报错。

作为测试新手,想用真实接口的心情我能理解,但组件单元测试的核心是隔离外部依赖,Mock才是正确的思路。不过我也会给你讲清楚两种处理方式:

一、推荐方案:Mock Axios(最可靠、快速)

Mock掉Axios的请求方法,让它返回你预设的假数据,这样测试完全不依赖外部接口,也不会有网络问题。

举个实际的例子:
假设你的组件代码是这样的:

import React, { useEffect, useState } from 'react';
import axios from 'axios';

export default function DataFetcher() {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    async function fetchData() {
      try {
        const res = await axios.get('/api/user');
        setData(res.data);
      } catch (err) {
        console.error('请求失败:', err);
      } finally {
        setLoading(false);
      }
    }
    fetchData();
  }, []);

  if (loading) return <p>加载中...</p>;
  return <p>用户名:{data?.name}</p>;
}

对应的测试代码可以这么写:

import React from 'react';
import { render, screen, waitFor } from '@testing-library/react';
import axios from 'axios';
import DataFetcher from './DataFetcher';

// 告诉Jest要Mock整个axios模块
jest.mock('axios');

describe('DataFetcher组件测试', () => {
  it('成功获取数据后渲染内容', async () => {
    // 模拟axios.get的成功返回
    const mockUserData = { name: 'wa-rren-dev' };
    axios.get.mockResolvedValue({ data: mockUserData });

    // 渲染组件
    render(<DataFetcher />);

    // 初始状态应该显示加载中
    expect(screen.getByText('加载中...')).toBeInTheDocument();

    // 等待数据加载完成,断言渲染结果
    // 这里用waitFor或者直接用screen.findByText(findBy*本身就是异步的,会自动等待)
    const userNameElement = await screen.findByText('用户名:wa-rren-dev');
    expect(userNameElement).toBeInTheDocument();
  });

  it('请求失败后处理加载状态', async () => {
    // 模拟请求失败
    axios.get.mockRejectedValue(new Error('网络错误'));

    render(<DataFetcher />);

    // 等待加载状态消失
    await waitFor(() => {
      expect(screen.queryByText('加载中...')).not.toBeInTheDocument();
    });
    // 如果你的组件有错误提示,这里可以断言错误信息是否显示
  });
});

这里的关键是:

  • jest.mock('axios')会自动替换axios模块为Mock版本
  • mockResolvedValue/mockRejectedValue用来模拟请求的成功/失败
  • 用waitFor或者findBy*方法来等待异步操作完成,这就是你想要的“让Jest等待组件完成渲染/请求”的实现方式

二、不推荐但满足你需求的方案:尝试真实请求

如果你非要用真实接口,那你得跳出Jest的jsdom环境——比如:

  1. 用E2E测试工具:比如Cypress,它会启动真实的浏览器,自然可以发送真实网络请求,适合测试完整的用户流程,但这不是组件单元测试了。
  2. 调整Jest环境:把测试环境改成node(在jest.config.js里设置testEnvironment: 'node'),但这样就没有DOM环境了,没法测试组件的渲染效果,意义不大。

总结

作为测试新手,Mock是必须要掌握的技能——它能让你的测试不受外部环境影响,运行速度快,结果稳定。而你关心的“等待组件渲染/请求完成”,用React Testing Library的waitFor或者findBy*系列查询就能轻松解决。

内容的提问来源于stack exchange,提问作者wa-rren-dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:10:59