用途:当测试存在任意延迟(setTimeout、sleep、time.sleep())、结果不稳定、并行运行时超时,或需要等待异步操作完成时使用。不适用于测试真实时序行为(如 debounce、throttle 间隔);若确需任意超时必须注释说明原因。
核心原则:等待真正关心的条件,而不是猜测需要多久。
核心模式:把 await new Promise(r => setTimeout(r, 50)) 这类猜测改为 waitFor(() => getResult() !== undefined),之后再断言。
常用场景:等待事件 waitFor(() => events.find(e => e.type === 'DONE'));等待状态 waitFor(() => machine.state === 'ready');等待数量 waitFor(() => items.length >= 5);等待文件 waitFor(() => fs.existsSync(path));复杂条件 waitFor(() => obj.ready && obj.value > 10)。
实现:提供通用轮询函数 waitFor,接收 condition、description、timeoutMs(默认 5000)。循环内调用 condition,为真则返回;超时抛出含描述与时长的错误;否则每 10ms 轮询一次。示例文件还包含 waitForEvent、waitForEventCount、waitForEventMatch 等领域辅助函数。
常见错误:轮询过快(如每 1ms)浪费 CPU,应每 10ms;无超时会死循环,应始终带超时与清晰错误;缓存过期数据,应在循环内重新取值。
任意超时何时正确:如工具每 100ms 跳动,需 2 次跳动验证部分输出,则先等待条件,再等待 200ms 的已知时序并注释原因。
据资料所述,某次调试中修复 3 个文件共 15 个不稳定测试,通过率从 60% 提升到 100%,执行时间快 40%。