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

Jest test.each能否运行时赋值?测试无输出/超时问题排查

Jest test.each 运行时赋值问题解决方案

问题根源

你的代码出现无输出或超时问题,核心原因有两个:

  1. Jest测试用例解析时机:test.each是在Jest解析测试文件的静态阶段执行的,早于beforeAll(测试运行阶段执行)。因此你在beforeAll里给table赋的值根本没被test.each用到,它用的是初始值[[]]。
  2. 测试数据结构错误:你定义的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:25:18