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

如何Mock AWS SDK v3分页器?单元测试问题求助

解决AWS SDK v3分页器paginateGetRestApis单元测试Mock问题

你的核心问题是mock的返回值不是异步可迭代对象(async iterable),for await...of语法要求迭代对象必须实现异步迭代器接口,直接返回普通的RestApis对象自然会报错。

解决方案:模拟异步生成器(Async Generator)

要让mock的paginateGetRestApis返回符合要求的异步可迭代对象,你需要用异步生成器函数来生成mock数据。

修改后的测试代码如下:

const mockApiItems: RestApi[] = [
  {
    name: 'bumpy_dove',
  },
];
const mockRestApis: RestApis = {
  items: mockApiItems,
};

const mockPaginageGetRestApis = mocked(paginateGetRestApis, true);

// 用异步生成器模拟分页器的返回值
mockPaginageGetRestApis.mockImplementation(() => {
  // 返回一个async iterable,每次yield一页数据
  return (async function* () {
    yield mockRestApis;
  })();
});

const apisReturned = await getMyApis(); // 注意函数名要和业务代码中的getMyApis对应
expect(apisReturned).toStrictEqual(mockApiItems);

关键说明

  1. 异步生成器的作用:async function*()创建的异步生成器会返回一个异步迭代器,完全匹配paginateGetRestApis的返回类型,能被for await...of正确遍历。
  2. 多页数据模拟:如果需要测试多页场景,只需要在生成器里多次yield不同的分页结果即可:
    return (async function* () {
      yield { items: [{ name: 'api_page1' }] };
      yield { items: [{ name: 'api_page2' }] };
    })();
    
  3. 类型兼容:如果TS类型检查报错,可以给生成器的返回值加as any临时规避(你提到后续会做E2E测试,暂时忽略精确类型没问题)。

额外注意

确保你已经正确mock了paginateGetRestApis和客户端的导入,比如在测试文件顶部添加:

jest.mock('@aws-sdk/client-api-gateway', () => ({
  ...jest.requireActual('@aws-sdk/client-api-gateway'),
  APIGatewayClient: jest.fn(), // 同时mock客户端,避免真实初始化
  paginateGetRestApis: jest.fn(),
}));

内容的提问来源于stack exchange,提问作者ghidalgo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:28:19