如何在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
相关产品推荐
相关产品推荐

