Jest test.each能否运行时赋值?测试无输出/超时问题排查
Jest test.each 运行时赋值问题解决方案
问题根源
你的代码出现无输出或超时问题,核心原因有两个:
- Jest测试用例解析时机:
test.each是在Jest解析测试文件的静态阶段执行的,早于beforeAll(测试运行阶段执行)。因此你在beforeAll里给table赋的值根本没被test.each用到,它用的是初始值[[]]。 - 测试数据结构错误:你定义的
table类型是Array<number[][]>(二维数组的数组),但test.each需要的是一维数组的数组(每个子数组对应一组测试参数)。你在beforeAll里把[[1,2,3],[4,5,6],[7,8,9]]整个push到table里,导致table变成三维数组,完全不符合test.each的参数要求。
正确实现方式
方式一:同步数据直接顶层赋值
如果测试数据是同步获取的(比如硬编码、本地文件读取),直接在describe块内部顶层赋值即可,无需beforeAll:
describe('jb-tests', () => { jest.setTimeout(700000); // 正确定义测试数据:一维数组的数组,每个子数组对应一组测试参数 const table: Array<number[]> = [[1,2,3],[4,5,6],[7,8,9]]; test.each(table)('.add(%i, %i) 预期得到 %i', (a, b, expected) => { console.log(`测试参数:a=${a}, b=${b}, expected=${expected}`); // 务必添加测试断言,否则Jest可能判定测试未完成 expect(a + b).toBe(expected); }); });
方式二:异步数据动态生成测试用例
如果测试数据需要异步获取(比如API请求、数据库查询),可以在beforeAll里拿到数据后,动态生成测试用例:
describe('jb-tests', () => { jest.setTimeout(700000); let table: Array<number[]> = []; beforeAll(async () => { // 模拟异步获取数据的逻辑 // const response = await fetch('your-api-url'); // table = await response.json(); table = [[1,2,3],[4,5,6],[7,8,9]]; }); // 动态生成测试用例 table.forEach(([a, b, expected]) => { test(`.add(${a}, ${b}) 预期得到 ${expected}`, () => { console.log(`测试参数:a=${a}, b=${b}, expected=${expected}`); expect(a + b).toBe(expected); }); }); });
方式三:使用test.each的异步数据源
Jest支持test.each接受一个返回Promise的函数,直接异步获取测试数据:
describe('jb-tests', () => { jest.setTimeout(700000); // 异步获取测试数据的函数 const fetchTestData = async () => { // 替换为实际的异步逻辑 // const data = await someAsyncOperation(); return [[1,2,3],[4,5,6],[7,8,9]]; }; // test.each直接使用异步数据源 test.each(fetchTestData())('.add(%i, %i) 预期得到 %i', (a, b, expected) => { console.log(`测试参数:a=${a}, b=${b}, expected=${expected}`); expect(a + b).toBe(expected); }); });
额外注意事项
- 必须添加断言:原测试代码只有
console.log,没有任何断言,Jest可能会认为测试未完成,导致超时错误。务必添加expect断言来结束测试。 - 类型匹配:确保
table的结构和测试函数的参数个数、类型完全匹配,避免参数解析错误。
内容的提问来源于stack exchange,提问作者Jaspreet Kaur Banwait
相关产品推荐
相关产品推荐

