测试异步生成器需用 for await...of 驱动或 await gen.next(),验证 {value, done}、错误传播、提前终止及边界场景;普通生成器仅产出 Promise,不可 await next()。

测试生成器函数的异步流,关键在于模拟其执行节奏、控制 yield 暂停点,并验证每次 next() 调用后返回的 { value, done } 结构是否符合预期,同时确保内部 await 和 yield 的组合行为被正确覆盖。
明确被测对象类型
先区分是普通生成器(function*)还是异步生成器(async function*):
- 普通生成器本身不处理异步逻辑,只是产出 Promise 对象;测试重点是它产出的 Promise 是否构造正确、顺序是否准确
- 异步生成器(
async function*)会真正暂停并等待 Promise 解析后再yield值;测试需覆盖for await...of消费过程、错误传播、提前终止等行为
对异步生成器使用 for await...of 驱动测试
这是最贴近真实使用场景的方式。在测试中手动遍历,逐次断言每次产出的值和完成状态:
- 用
jest.mock()或sinon替换依赖的异步调用(如fetch、db.query),使其返回可控的 Promise - 创建生成器实例后,用
for await (const item of gen)收集结果,或用gen.next()手动推进并await其返回的 Promise - 注意:调用
gen.next()在异步生成器中返回的是Promise<{ value, done }>,必须await它
覆盖边界与异常情况
异步生成器容易在以下环节出错,测试需显式覆盖:
立即学习“Java免费学习笔记(深入)”;
-
中途抛错:在
yield await someAsyncOp()中 reject,检查是否能被try/catch捕获,或是否正确传递给消费者 -
提前 return / break:在
for await循环中提前退出,触发生成器的return()方法,验证清理逻辑(如finally块)是否执行 -
空流或无限流:测试生成器在无数据时是否及时
done: true,或在未加限制时是否会持续 yield(可结合AbortController或超时断言)
避免常见误区
有些写法看似在“测试异步流”,实则没触达核心逻辑:
- 只调用生成器函数却不遍历 —— 这只得到一个未启动的迭代器,什么都没执行
- 用
expect(gen).toBeInstanceOf(AsyncGenerator)仅校验类型,不验证行为 - 对普通生成器直接
await其next()返回值 —— 它返回的是普通对象,不是 Promise,会报错


















