跳到主要内容
版本:26.x.

імітаціїїтаймерів.

本机定时器功能(即,索取setInterval.清除时间ClearInterval.)对于测试环境的理想是理想的,因为它们依赖于实时经历。Jest可以使用允许您控制时间流逝的功能来交换定时器。伟大的斯科特!

// timergame.js.
'使用strict' ;
功能 Timergame. 打回来 {
安慰 日志 '预备,开始!' ;
索取 => {
安慰 日志 “时间上 - 停止!” ;
打回来 && 打回来 ;
} 1000 ;
}
模块 出口 = Timergame. ;
// __tests __ / timergame-test.js
'使用strict' ;
笑话 Usefaketimers. ;
测试 '在结束游戏之前等待1秒' => {
const Timergame. = 要求 '../timergame' ;
Timergame. ;
预计 索取 tohavebeencalledtimes. 1 ;
预计 索取 tohavebeenlastcalledwith. 预计 任何 功能 1000 ;
} ;

在这里,我们通过致电启用假计时器jest.usefaketimers();。此模拟具有模拟功能的SetTimeOut和其他定时器函数。如果在一个文件内运行多个测试或描述块,jest.usefaketimers();可以手动或使用设置功能在每个测试之前调用摘要。没有这样做会导致内部使用计数器未被重置。

Запуститивсітаймери.

我们可能想要为此模块编写的另一个测试是一个断言回调在1秒后调用回调。为此,我们将使用Jest的定时器控件API在测试中间的快速前进时间:

测试 '在1秒后调用回调' => {
const Timergame. = 要求 '../timergame' ;
const 打回来 = 笑话 FN. ;
Timergame. 打回来 ;
//此时,尚未调用回调
预计 打回来 不是 被称为 ;
//快进,直到所有计时器都已执行
笑话 润滑司机 ;
//现在应该调用我们的回调!
预计 打回来 被称为 ;
预计 打回来 tohavebeencalledtimes. 1 ;
} ;

运行未决的计时器

还有一个场景,您可能有一个递归定时器 - 这是一个计时器,它在自己的回调中设置一个新的计时器。为此,运行所有计时器将是一个无穷无尽的循环...所以有些东西jest.runalltimers()是不可取的。对于这些案例,您可以使用jest.runonlypendingTimers()

// infinitetimergame.js.
'使用strict' ;
功能 Infinitetimergame. 打回来 {
安慰 日志 '预备,开始!' ;
索取 => {
安慰 日志 “时间上了!下一场比赛开始前10秒......” ;
打回来 && 打回来 ;
//在10秒内安排下一个游戏
索取 => {
Infinitetimergame. 打回来 ;
} 10000 ;
} 1000 ;
}
模块 出口 = Infinitetimergame. ;
// __tests __ / infinitetimergame-test.js
'使用strict' ;
笑话 Usefaketimers. ;
描述 'Infinitetimergame' => {
测试 '在1秒后提出一个10秒的计时器' => {
const Infinitetimergame. = 要求 '../infinitetimergame' ;
const 打回来 = 笑话 FN. ;
Infinitetimergame. 打回来 ;
//此时,应该有一个单一的呼叫
//索取第1秒钟的比赛结束。
预计 索取 tohavebeencalledtimes. 1 ;
预计 索取 tohavebeenlastcalledwith. 预计 任何 功能 1000 ;
//仅前进和排气目前待定的计时器
//(但不是该过程期间创建的新计时器)
笑话 RunonlyPendingTimers. ;
//此时,我们的1秒计时器应该解雇它的回调
预计 打回来 被称为 ;
//它应该创建一个新的计时器来开始游戏
// 10秒
预计 索取 tohavebeencalledtimes. 2 ;
预计 索取 tohavebeenlastcalledwith. 预计 任何 功能 10000 ;
} ;
} ;

通过时间推进定时器

重命名Runtimerstotime.AdvancetimersByTime开玩笑22.0.0

另一种可能性是使用Jest.AdvancetimersBytyTime(Mstorun)。调用此API时,所有计时器都是先进的Mstorun.毫秒。将通过SetTimeOut()或setInterval()排队的所有挂起的“宏任务”,并将执行在此时间框架中执行。此外,如果这些宏任务调度将在同一时间框架内执行的新宏任务,则将执行那些在队列中剩余的宏任务中剩余的宏任务,以在mstorun毫秒内运行。

// timergame.js.
'使用strict' ;
功能 Timergame. 打回来 {
安慰 日志 '预备,开始!' ;
索取 => {
安慰 日志 “时间上 - 停止!” ;
打回来 && 打回来 ;
} 1000 ;
}
模块 出口 = Timergame. ;
'通过AdvancetimersByTime拨打1秒后调用回调 => {
const Timergame. = 要求 '../timergame' ;
const 打回来 = 笑话 FN. ;
Timergame. 打回来 ;
//此时,尚未调用回调
预计 打回来 不是 被称为 ;
//快进,直到所有计时器都已执行
笑话 AdvancetimersByTime 1000 ;
//现在应该调用我们的回调!
预计 打回来 被称为 ;
预计 打回来 tohavebeencalledtimes. 1 ;
} ;

最后,它可能偶尔在一些测试中有用,以便能够清除所有未决的定时器。为此,我们有Jest.ClearAllTimers()

此示例的代码可用示例/计时器