【发布时间】:2021-07-02 03:02:07
【问题描述】:
我正在用 Jest 编写一个自动测试框架。为此,我需要在一定的时间间隔内运行一些后台任务。总之,这就像轮询。我们举一个伪代码的例子。
test('Some potato poteto test', () => {
jest.setTimeout(12000000); // 20 min
const intervalPeriod = 5 * 60 * 1000; // 5 min
let retry = 0;
const intervalId = setInterval(() => {
console.log("I am doing my 5 minutes check");
// my custom logic goes here
retry++;
if(retry === MAX_RETRY) { // this will be always hit
clearInterval(intervalId)
}
}, intervalPeriod);
});
因此,每 5 分钟,我将进行一次网络调用,执行一些我的自定义逻辑。现在,问题是在运行它时,测试完成但jest 无法终止。
我的意思是“测试完成”,测试套件运行了,但 setInterval 中的代码没有立即执行。
我的问题是,发生这种情况是因为setInterval 没有立即在事件循环中运行并且jest 没有配置为运行setInterval?
请注意,我不想模拟 setInterval,也不想使用任何假计时器。
那么,有没有可能用Jest来实现呢?
我也尝试了与 cron 库的相同的事情,但它是同样的问题。 Jest 不执行代码并完成执行然后停止,因为那些 setInterval/cron 仍在后台运行。
有没有办法在 Jest 中运行这些任务?我的意思是有没有办法运行这些作业并在它们完成后终止 Jest?
【问题讨论】:
-
useFakeTimers 是要走的路……但如果你真的不想……有标志
--maxWorkers,它根据你机器的核心跨越工人……仅此测试会消耗整个核心 5 分钟...所以...也许您可以将此测试作为单独的测试? (仅在您执行类似 test:thatonethattakes5min 时运行)
标签: node.js typescript jestjs