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

如何在Jest中测试异步生成器并获取其yield返回值

问题原因与解决方法

核心错误点

  • 语法错误:for await的await关键字位置错误,你写的for (await let retVal of gen)不符合标准语法,正确写法是for await (let retVal of gen)
  • 取值逻辑错误:使用for await...of遍历异步生成器时,迭代变量直接获取到的就是yield返回的值,不需要额外访问.value属性(.value是手动调用生成器.next()方法返回的结果对象才有的属性)
  • Jest异步测试未正确声明:你没有把测试用例函数标记为async,Jest会在异步IO执行完成前直接结束测试,所以看不到循环内的输出,也不会触发循环逻辑

正确实现代码

首先确保你的测试用例函数标记为async:

import { lineOfFileGenerator } from './你的生成器文件路径';
import { statSync } from 'fs';

test('测试异步生成器按行读取文件', async () => {
  // 先验证文件存在
  expect(statSync('path/to/file.csv').isFile()).toBe(true);

  const gen = lineOfFileGenerator('path/to/file.csv');
  const lines: string[] = [];
  // 正确的for await写法
  for await (const line of gen) {
    console.log('读取到的行:', line);
    lines.push(line);
  }

  // 可以加断言验证读取结果
  expect(lines.length).toBeGreaterThan(0);
  // 如果你知道文件内容可以加精确断言,比如expect(lines[0]).toBe('第一行内容')
}, 5000); // 可选:如果测试有超时风险可以手动设置超时时间,单位为毫秒

补充注意事项

  • 如果需要多次遍历同一个文件,需要重新调用lineOfFileGenerator生成新的生成器实例,每个生成器实例只能迭代一次,这是生成器的标准特性,不是bug
  • 确保测试中引入的createReadStream、createInterface等Node.js API在Jest运行环境中可以正常访问,如果你配置了Jest的运行环境为jsdom,需要手动把fs相关API加入全局允许列表,或者修改测试环境为node

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:57:06