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

如何使用Jest模拟多个Axios并发接口调用?

Jest Mock Axios 并发请求实现方法

注意你当前代码存在隐性问题:.then(axios.spread((todos, posts) => {todos, posts}))的写法会返回undefined,大括号会被识别为函数体而非返回对象,需要修改为.then(axios.spread((todos, posts) => ({todos, posts}))),用小括号包裹对象标识直接返回,否则最终respData会为空。


1. 初始化Mock规则

在测试文件顶部先全局Mock整个axios模块,同时手动实现axios.spread的mock逻辑:

import axios from 'axios';
import { handler } from './你的handler文件对应路径';

// 全局mock axios模块
jest.mock('axios');
// 把axios转为带jest mock类型的实例,方便类型提示
const mockedAxios = axios as jest.Mocked<typeof axios>;
// 模拟axios.spread的原生逻辑:接收回调,返回一个把数组参数展开传入回调的函数
mockedAxios.spread.mockImplementation((callback) => (arr) => callback(...arr));

2. 编写测试用例

因为你的并发请求调用axios.get的顺序是固定的,直接按调用顺序给axios.get设置对应模拟返回值即可,axios.all会自动等待所有mock的Promise执行完成:

describe('handler 功能测试', () => {
  // 每个用例执行前清空mock调用记录
  beforeEach(() => mockedAxios.get.mockClear());

  it('并发请求正常时返回预期结构', async () => {
    // 准备模拟接口返回数据
    const mockTodos = [{ id: 1, title: '测试待办', completed: false }];
    const mockPosts = [{ id: 1, title: '测试文章', body: '测试内容' }];
    
    // 按get调用顺序设置返回值:第一个get对应todos接口,第二个对应posts接口
    mockedAxios.get
      .mockResolvedValueOnce({ data: mockTodos })
      .mockResolvedValueOnce({ data: mockPosts });

    // 执行handler
    const result = await handler({} as APIGatewayProxyEvent);
    const respBody = JSON.parse(result.body);

    // 断言验证
    expect(mockedAxios.get).toHaveBeenCalledTimes(2);
    // 验证第一个请求参数是否正确
    expect(mockedAxios.get).toHaveBeenNthCalledWith(1, 
      'https://jsonplaceholder.typicode.com/todos?_limit=5',
      expect.objectContaining({
        headers: expect.objectContaining({ authorization: 'Token' })
      })
    );
    // 验证返回结果
    expect(respBody.todos).toEqual(mockTodos);
    expect(respBody.posts).toEqual(mockPosts);
    expect(result.statusCode).toBe(200);
  });

  it('请求异常时正常捕获错误', async () => {
    // 模拟请求抛出异常
    mockedAxios.get.mockRejectedValueOnce(new Error('请求超时'));
    const consoleErrSpy = jest.spyOn(console, 'error').mockImplementation(() => {});

    const result = await handler({} as APIGatewayProxyEvent);
    expect(consoleErrSpy).toHaveBeenCalledWith(new Error('请求超时'));
    expect(result.body).toBe(JSON.stringify(undefined));

    consoleErrSpy.mockRestore();
  });
});

内容的提问来源于stack exchange,提问作者kamlesh.bar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:06:01