测试节点-使用SINON FakeTimers调度
我想测试
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次
希望这对您有帮助。
相关文章