使用数据库获取参数执行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
相关产品推荐
相关产品推荐

