如何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);
关键说明
- 异步生成器的作用:
async function*()创建的异步生成器会返回一个异步迭代器,完全匹配paginateGetRestApis的返回类型,能被for await...of正确遍历。 - 多页数据模拟:如果需要测试多页场景,只需要在生成器里多次
yield不同的分页结果即可:return (async function* () { yield { items: [{ name: 'api_page1' }] }; yield { items: [{ name: 'api_page2' }] }; })(); - 类型兼容:如果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
相关产品推荐
相关产品推荐

