测试节点-使用SINON FakeTimers调度

本教程将介绍测试节点-使用SINON FakeTimers调度的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

测试节点-使用SINON FakeTimers调度 教程 第1张

问题描述

我想测试node-schedule包中的scheduleJob。使用SINONuseFakeTimers(),我可以跳过时间。不幸的是,我的日程安排程序似乎并不"相信"假时间。当我将调度器设置为1分钟时,它工作得很好,所以我知道它工作得很好。我也试着在通话前一分钟设置假时间,也不起作用。

SINON:

let clock = sinon.useFakeTimers(moment().toDate());
 clock.tick(60*60*23);

和我的计划作业:

 let job_2 = schedule.scheduleJob(new Date(date.toISOString()), function (user) {
  console.log("get's here..");
  if (user.status === 'pending') {
user.remove(function (error) {
 if (!error) {
  mid.addEvent({
action: 'deleted_user'
  }, {
name: user.name
  }, function (error) {
if (error) {
 console.log("error: " + error);
}
  });
 }
});
  }
 }.bind(null, user));

有人知道吗?

推荐答案

@MPasman

您的测试是什么样子的?节点调度的作者用SINON测试他们的代码,所以我看不出这有什么问题。

see this for examples

我能够使用Jasmine的fakeAsync在第六角测试我的工作,如下所示:

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">

it('should call appropriate functions when cronJob is triggered, bad ass test',
fakeAsync(() => {
  const channelSpy = spyOn(messengerService, 'createChannels');
  const listenerSpy = spyOn(messengerService, 'createListener');
  const messengerSpy = spyOn(messengerService.messenger,
'unsubscribeAll');
  // reset your counts
  channelSpy.calls.reset();
  listenerSpy.calls.reset();
  messengerSpy.calls.reset();
  messengerService.cronJob.cancel();
  // run cron job every second
  messengerService.cronJobTime = '* * * * * *';
  messengerService.scheduleMyJsCronJob();
  tick(3150);
  messengerService.cronJob.cancel();
  expect(channelSpy.calls.count()).toEqual(3);
  expect(listenerSpy.calls.count()).toEqual(3);
  expect(messengerSpy.calls.count()).toEqual(3);
}));

我测试的服务中的实际函数:

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">

  scheduleMyJsCronJob(): void {
 this.cronJob = scheduleJob(this.cronJobTime, () => {
//  logic to unsubscribe at midnight
this.messenger.unsubscribeAll();
// create new channels
this.createChannels(
 this.sessionStorageService.getItem('general-settings'));
this.createListener(
 this.sessionStorageService.getItem('general-settings'));
 });
  }

基本策略为:

1)监视您的cronJob应在计划时调用的函数

2)取消所有以前的作业(如果有的话)(您也可以在After Each中这样做,它在每个单元测试之后运行)。Node-Schedule还提供了一个名为scheduledJobs的函数,该函数返回一个包含所有已调度函数的对象。您可以在其上循环并全部取消)

3)将cronTime设置为每秒运行一次,以便于测试

4)将时钟打勾一秒多一点(在我的例子中,我做的是3秒多一点)

5)取消作业以停止它(否则它将继续运行,并且您的测试将超时)。

6)预期您的函数将被调用x次

希望这对您有帮助。

好了关于测试节点-使用SINON FakeTimers调度的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。