test.each 支持 async 回调函数,需显式声明 async 且异步逻辑置于测试体内;数据矩阵必须同步定义,不可在数组或模板字符串中嵌入 Promise 或 await 表达式。

Jest 的 test.each 本身不支持直接 async/await 的测试函数体(它只接受同步函数),但你可以把 async 函数作为测试主体传入,Jest 会自动等待其完成——前提是测试函数**显式声明为 async**,且你**不在 test.each 的模板字符串中写异步逻辑**。
✅ 正确写法:在 test callback 中用 async/await
test.each 支持传入一个 async 回调函数,Jest 会识别并正确 await 它。数据矩阵仍是同步定义的,异步操作放在测试体内即可:
test.each([
['user1', 'password1', 200],
['admin', 'secret', 200],
['guest', 'wrong', 401],
])('login with %s / %s → status %d', async (username, password, expectedStatus) => {
const res = await fetch('/api/login', {
method: 'POST',
body: JSON.stringify({ username, password }),
});
expect(res.status).toBe(expectedStatus);
});
⚠️ 常见错误:在数据数组里写 Promise 或 async
下面这些写法是错的,会导致测试提前结束或报错:
- ❌ 数据项里放
Promise(如[promise1, promise2])→test.each不会 await 它们 - ❌ 在模板字符串插值中调用异步函数(如
'%s → %o'里传await fn())→ 模板解析阶段就执行,不是测试运行时 - ❌ 忘记加
async关键字 → Jest 当作同步测试,内部await不生效,可能报undefined或超时
? 进阶技巧:动态生成异步测试数据
如果测试数据需异步获取(比如从 API 或 DB 加载),不能直接塞进 test.each 数组(因为数组必须同步构造)。解决方案是:先 await 获取数据,再调用 test.each:
describe('API validation tests', () => {
test('should validate all known endpoints', async () => {
// ✅ 先异步加载测试数据
const testData = await loadTestCasesFromDB(); // 返回 [{ path: '/v1/users', method: 'GET', ... }]
// ✅ 再用同步数组调用 test.each
test.each(testData)('validate $path ($method)', async ({ path, method, expected }) => {
const res = await request(app)[method.toLowerCase()](path);
expect(res.status).toBe(expected);
});
});
});
? 小贴士
- Jest 默认对
async测试有 5 秒超时,如需更久,加jest.setTimeout(10000)或在test后加.timeout(10000) - 每个
test.each行都是独立测试,失败互不影响,错误信息会带上具体参数(如login with guest / wrong → status 401) - 避免在
beforeAll中做耗时异步初始化;如需共享状态,优先用beforeEach+ 缓存变量


















