我在用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
})
}
有人知道如何测试上面的代码块吗?
谢谢!
1条答案
按热度按时间hmae6n7t1#
可能是迟到了,但我自己也在纠结这个问题,想分享一下我的解决方案:
使用中的方法
试验
我没有使用test函数创建一个测试cronjob,而是模拟了cronjob在tick时调用的实际函数(在您的例子中,我认为应该是getSqsApproval)。然后,我期望使用 * any CronJob * 调用schedulerRegistry. addCronJob,因为我不知 prop 体的作业。创建一个新作业并期望它在这里不会起作用。
最后,我将时间提前了1个小时,因为我的testCronExpression是0****。您应该根据用于测试的cron表达式提前时间。期望在经过一段时间后调用callbackFunction(实际上)对我很有效。
希望这有帮助!