Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Jest测试节点cron作业函数_Javascript_Node.js_Testing_Cron_Jestjs - Fatal编程技术网

Javascript 使用Jest测试节点cron作业函数

Javascript 使用Jest测试节点cron作业函数,javascript,node.js,testing,cron,jestjs,Javascript,Node.js,Testing,Cron,Jestjs,我有一个javascript类,其中包含一个函数,该函数使用节点cron库启动cron作业。 但是我似乎找不到一种方法来测试类和函数 控制节点cron的变量位于.env文件中。 为了进行测试,我使用了jest。 当我的节点应用程序的app.js启动时,我的作业启动(类文件被导入并被导出实例化) .env文件 #CRON JOB FREQUENCY_CRON='30 00 * * *' TIMEZONE="America/Sao_Paulo" SCHEDULED=true INACTIVE_EXP

我有一个javascript类,其中包含一个函数,该函数使用
节点cron
库启动cron作业。 但是我似乎找不到一种方法来测试类和函数

控制
节点cron
的变量位于
.env
文件中。 为了进行测试,我使用了jest。 当我的节点应用程序的app.js启动时,我的作业启动(类文件被导入并被导出实例化)

.env文件

#CRON JOB
FREQUENCY_CRON='30 00 * * *'
TIMEZONE="America/Sao_Paulo"
SCHEDULED=true
INACTIVE_EXPIRATION_TIME=2592000000 #30 DAYS

CronJob.js

class CronJob {
  constructor() {
    this.startJob();
  }

  async startJob() {
    cron.schedule(
      process.env.FREQUENCY_CRON,
      async () => {
        //DO SOME DATA PROCESSING 
      },
      {
        scheduled: process.env.SCHEDULED,
        timezone: process.env.TIMEZONE
      }
    );
  }
}

export default new CronJob();

您可以使用模拟
节点cron
模块。在运行测试用例之前,使用
dotenv
包从
.env
加载环境变量

例如

cronJob.js

从“节点cron”导入cron;
类CronJob{
构造函数(){
这个.startJob();
}
异步启动作业(){
cron.schedule(
process.env.FREQUENCY\u CRON,
异步()=>{
log('DO SOME DATA PROCESSING');
},
{
计划:process.env.scheduled,
时区:process.env.timezone,
},
);
}
}
导出默认的新CronJob();
cronJob.test.js

从“节点cron”导入cron;
从“路径”导入路径;
require('dotenv').config({path:path.resolve(uu dirname,'./.env'))});
jest.mock('node-cron',()=>{
返回{
附表:jest.fn(),
};
});
描述('61765291',()=>{
它('应该通过',()=>{
constlogspy=jest.spyOn(控制台,'log');
mockImplementationOnce(异步(频率,回调)=>await callback());
要求('./cronJob');
expect(logSpy).toBeCalledWith('DO SOME DATA PROCESSING');
expect(cron.schedule).toBeCalledWith('30000***',expect.any(函数){
已计划:“true”,
时区:“美国/圣保罗”,
});
});
});
.env

#CRON JOB
FREQUENCY_CRON='30 00 * * *'
TIMEZONE="America/Sao_Paulo"
SCHEDULED=true
INACTIVE_EXPIRATION_TIME=2592000000 #30 DAYS
100%覆盖率的单元测试结果:

PASS stackoverflow/61765291/cronJob.test.js(8.148s)
61765291
✓ 应通过(30毫秒)
console.log
做一些数据处理
在海关控制台。(node_modules/jest环境酶/node_modules/jest mock/build/index.js:866:25)
------------|---------|----------|---------|---------|-------------------
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s
------------|---------|----------|---------|---------|-------------------
所有文件| 100 | 100 | 100 | 100 |
cronJob.js | 100 | 100 | 100 | 100 |
------------|---------|----------|---------|---------|-------------------
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:9.145秒,估计10秒

我得到的属性“mockImplementationOnce”在类型(cronExpression:string,func:()=>void,options?:ScheduleOptions)=>ScheduledTask)上不存在。ts必须添加
(cron.schedule与jest.Mock一样未知)