Jest.js 如何在Nestjs中为CronJob编写单元测试

z0qdvdin  于 2023-01-28  发布在  Jest
关注(0)|答案(1)|浏览(206)

我在用jest为下面的代码片段编写单元测试时遇到了困难:

async addCronJob(props: IAddAndUpdateCronJobDetails) {
   const {name, individualSchedule} = props;
   const parsedCronTime = convertDateAndTimeToCron(
   individualSchedule.timeOfRun,
   individualSchedule.dateOfrun
   )

  const {jobType, dateOfRun, id, timeOfRun} = individualSchedule;

  const newJob = new CronJob(
   parsedCronTime,
   async () => {
   return this.sqsService.getSqsApproval({
   //some properties
    }).then(() => {
    //some logic
    })
   },
   null,
   false,
   'Asia/Singapore'
  )

 this.schedulerRegistry.addCronJob(name, newJob)
 newJob.start()
}

下面是我的单元测试:

//at the top
jest.mock('cron', () => {
const mScheduleJob = {start: jest.fn(), stop: jest.fn()};
const mCronJob = jest.fn(() => mScheduleJob);
return {CronJob: mCronJob}
})

***************

describe('addCronJob', () => {
 it('should add a new cron job', async (done) => {
  const testFn = jest.fn();
  const parsedCronTime = convertDateAndTimeToCron(
   mockSchedule.timeOfRun,
   mockSchedule.dateOfrun
   )
  const testCronJob = new CronJob(
  parsedCronTime,
  testFn,
  null,
  false,
  'Asia/Singapore'
  );
 
 return dynamicCronService.addCron({//properties}).then(() => {
   expect(CronJob).toHaveBeenCalledWith(//properties);
   expect(testCronJob.start).toBeCalledTimes(1);
   done()
 })
 })

})

上述测试通过,没有错误。但是,无法在cron作业本身中测试此异步代码块:

async () => {
   return this.sqsService.getSqsApproval({
   //some properties
    }).then(() => {
    //some logic
    })
 }

有人知道如何测试上面的代码块吗?
谢谢!

hmae6n7t

hmae6n7t1#

可能是迟到了,但我自己也在纠结这个问题,想分享一下我的解决方案:
使用中的方法

async addCronJob(taskName: string, cronEx: string, onTickCallback: () => void | Promise<void>): Promise<void> {
    const newJob = new CronJob(cronEx, onTickCallback);
    this.schedulerRegistry.addCronJob(taskName, newJob);
    newJob.start();
  }

试验

it('should create cronJob', async () => {
      await service.addCronJob(jobName, testCronExpression, callbackFunction);

      expect(schedulerRegistryMock.addCronJob).toHaveBeenCalledWith(jobName, expect.any(CronJob));

      jest.advanceTimersByTime(60 * 60 * 1000);
      expect(callbackFunction).toHaveBeenCalled();
    });

我没有使用test函数创建一个测试cronjob,而是模拟了cronjob在tick时调用的实际函数(在您的例子中,我认为应该是getSqsApproval)。然后,我期望使用 * any CronJob * 调用schedulerRegistry. addCronJob,因为我不知 prop 体的作业。创建一个新作业并期望它在这里不会起作用。
最后,我将时间提前了1个小时,因为我的testCronExpression是0****。您应该根据用于测试的cron表达式提前时间。期望在经过一段时间后调用callbackFunction(实际上)对我很有效。
希望这有帮助!

相关问题