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

使用数据库获取参数执行Jest测试失败问题求助

解决Jest中test.each使用异步获取参数时传入undefined的问题

问题原因

test.each在Jest的测试初始化阶段就会读取传入的参数值,而beforeAll钩子是在所有测试开始执行后才运行。所以当Jest解析test.each(ids)时,ids还未被beforeAll中的异步函数赋值,依然是undefined,导致报错。第一个测试能通过是因为它在beforeAll执行完成后才运行,此时ids已经被正确赋值。

解决方案1:使用异步工厂函数(Jest 27+ 推荐)

Jest 27及以上版本支持给test.each传入返回Promise的函数,它会等待Promise解析后再生成测试用例:

// 模拟从数据库获取ID的函数
async function fetchIDsFromDatabase() {
  return [1, 2, 3];
}

describe('Test for IDs returned from the database', () => {
  test('Checks if the list of IDs is not empty', async () => {
    const ids = await fetchIDsFromDatabase();
    expect(ids).toBeTruthy();
  });

  // 传入返回Promise的工厂函数
  test.each(async () => await fetchIDsFromDatabase())('Testing ID %i', (id) => {
    expect(id).toBeGreaterThan(0);
  });
});

解决方案2:动态生成测试用例(兼容低版本Jest)

如果你的Jest版本低于27,可以在beforeAll中获取数据后,动态创建测试用例:

// 模拟从数据库获取ID的函数
async function fetchIDsFromDatabase() {
  return [1, 2, 3];
}

describe('Test for IDs returned from the database', () => {
  let ids;

  beforeAll(async () => {
    ids = await fetchIDsFromDatabase();

    // 循环ID动态生成测试用例
    ids.forEach(id => {
      test(`Testing ID ${id}`, () => {
        expect(id).toBeGreaterThan(0);
      });
    });
  });

  test('Checks if the list of IDs is not empty', () => {
    expect(ids).toBeTruthy();
  });
});

说明

  • 方案1代码更简洁,符合test.each的原生设计,优先推荐使用。
  • 方案2通过在beforeAll中动态添加测试用例,绕过Jest初始化阶段的变量赋值限制,兼容所有Jest版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:28:25