跳到主要内容
版本: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();来源时代器数。通讯模拟次数可以模拟左从你在一起的。如果你在一起的东西。一个描述块中间行多次,可以在每次测试前手手jest.usefaketimers();,或者摘要中加加。如果不这样做的将导致内部的定时代不被重置。

运行所有定时器

我们还还写一个测试,用来于闻到数量是在1秒后被使用的的。为之,我们将使用jest的定时代控制api,用品在测试中间空间“快进”到正式的时间点。

测试 '在1秒后调用回调' => {
const Timergame. = 要求 '../timergame' ;
const 打回来 = 笑话 FN. ;
Timergame. 打回来 ;
//在时间点,定时代的回调不到被行
预计 打回来 不是 被称为 ;
//“快进”时间不含定时机回调回调执行
笑话 润滑司机 ;
//现处于参数应该应该被调使用了!
预计 打回来 被称为 ;
预计 打回来 tohavebeencalledtimes. 1 ;
} ;

运行未决的计时器

在某些场景下你可以还“循环定时代” - 在定时代的回调中间中再次设置一个新闻时代。对于对于种情况,如果将将时代一流行走下载下载那陷入死死死,在此场景下不行使用jest.runalltimers()对于这种情况,如果将定时代一流运行下游jest.runalltimers()对于这些案例,您可以使用jest.runonlypendingTimers()

'通过AdvancetimersByTime拨打1秒后调用回调 => {
const Timergame. = 要求 '../timergame' ;
const 打回来 = 笑话 FN. ;
Timergame. 打回来 ;
//在时间点,分数不应该执行
预计 打回来 不是 被称为 ;
//“快进”时间,使得别无即半时生回调都被行
笑话 AdvancetimersByTime 1000 ;
//到里里,无所事事的往来时机回调都应该被行行。期待(回调).tobecalled();
预计 打回来 tohavebeencalledtimes. 1 ;
} ;
// __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 ;
} ;
} ;
预计 索取 tohavebeencalledtimes. 1 ;
预计 索取 tohavebeenlastcalledwith. 预计 任何 功能 1000 ;
//仅前进和排气目前待定的计时器
//(但不是该过程期间创建的新计时器)
笑话 RunonlyPendingTimers. ;
//此时,我们的1秒计时器应该解雇它的回调
预计 打回来 被称为 ;
//它应该创建一个新的计时器来开始游戏
// 10秒
预计 索取 tohavebeencalledtimes. 2 ;
预计 索取 tohavebeenlastcalledwith. 预计 任何 功能 10000 ;
} ;
} ;

通过时间推进定时器

22.0.0版本的jest开开,Runtimerstotime.被重名目为AdvancetimersByTime

另一种可以方向是使用jeste。AdvancertimersByTime(Mstorun)。调用此API时,所有计时器都是先进的Mstorun.毫秒。调用此API时,所有计时器都是先进的Mstorun.毫秒。除了通过通信呢()或setInterval()而处于任务队列中间中的“宏任务”和一道其他应该在本时间片中间中间执行的广西都执行行。此外,如果这些宏任务安排新宏将在同一时间框架内执行的任务,直到在队列中剩余的宏任务中不再在mstorun毫秒内运行时,将执行这些任务。

// timergame.js.
'使用strict' ;
功能 Timergame. 打回来 {
安慰 日志 '预备,开始!' ;
索取 => {
安慰 日志 “时间上 - 停止!” ;
打回来 && 打回来 ;
} 1000 ;
}
模块 出口 = Timergame. ;
'通过AdvancetimersByTime拨打1秒后调用回调 => {
const Timergame. = 要求 '../timergame' ;
const 打回来 = 笑话 FN. ;
Timergame. 打回来 ;
//在时间点,分数不应该执行
预计 打回来 不是 被称为 ;
//“快进”时间,使得别无即半时生回调都被行
笑话 AdvancetimersByTime 1000 ;
//到到里,所有的师时机回调都应该被执行了!
预计 打回来 被称为 ;
预计 打回来 tohavebeencalledtimes. 1 ;
} ;

最后,在某些测试中你可以需要所状态状态下的时代器,为此,可口使用Jest.ClearAllTimers()。为此,我们有Jest.ClearAllTimers()

这个个子的代码位于:示例/计时器