我的库有基于实时的测试用例,我注意到测试会随机失败并出现 1 毫秒的错误:
expect(received).toBeGreaterThanOrEqual(expected)
Expected: >= 1000
Received: 999
Run Code Online (Sandbox Code Playgroud)
这似乎是由于 setTimeout 过早地调用了该函数。
所以我写了一个单独的测试脚本:
let last = Date.now()
setTimeout(next, 1000)
function next() {
if (Date.now() - last < 1000) process.exit(1)
last = Date.now()
setTimeout(next, 1000)
}
Run Code Online (Sandbox Code Playgroud)
在Node.js v12.19.0、v14.15.3、v15.4.0上,会随机失败:有时脚本可以继续运行,有时脚本很快就会退出。这不仅发生在我的本地计算机上,而且发生在 Github 的 CI 服务器上。
我的问题:这是一个错误吗?或者 setTimeout 的某种预期行为?还是Date.now() - time
总是需要加1毫秒?