测试节点-使用SINON FakeTimers调度

2022-06-18 00:00:00 node.js javascript sinon
我想测试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次

希望这对您有帮助。

相关文章