使用 Jest 测试 node-cron 作业功能

bsa*_*oss 5 javascript testing cron node.js jestjs

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

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

.env 文件

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

Run Code Online (Sandbox Code Playgroud)

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();

Run Code Online (Sandbox Code Playgroud)

sli*_*wp2 9

您可以使用jest.mock(moduleName,factory,options)来模拟node-cron模块。在运行测试用例之前使用dotenv包加载环境变量。.env

\n\n

例如

\n\n

cronJob.js

\n\n
import cron from \'node-cron\';\n\nclass CronJob {\n  constructor() {\n    this.startJob();\n  }\n\n  async startJob() {\n    cron.schedule(\n      process.env.FREQUENCY_CRON,\n      async () => {\n        console.log(\'DO SOME DATA PROCESSING\');\n      },\n      {\n        scheduled: process.env.SCHEDULED,\n        timezone: process.env.TIMEZONE,\n      },\n    );\n  }\n}\n\nexport default new CronJob();\n
Run Code Online (Sandbox Code Playgroud)\n\n

cronJob.test.js

\n\n
import cron from \'node-cron\';\nimport path from \'path\';\n\nrequire(\'dotenv\').config({ path: path.resolve(__dirname, \'./.env\') });\n\njest.mock(\'node-cron\', () => {\n  return {\n    schedule: jest.fn(),\n  };\n});\n\ndescribe(\'61765291\', () => {\n  it(\'should pass\', () => {\n    const logSpy = jest.spyOn(console, \'log\');\n    cron.schedule.mockImplementationOnce(async (frequency, callback) => await callback());\n    require(\'./cronJob\');\n    expect(logSpy).toBeCalledWith(\'DO SOME DATA PROCESSING\');\n    expect(cron.schedule).toBeCalledWith(\'30 00 * * *\', expect.any(Function), {\n      scheduled: \'true\',\n      timezone: \'America/Sao_Paulo\',\n    });\n  });\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

.env

\n\n
#CRON JOB\nFREQUENCY_CRON=\'30 00 * * *\'\nTIMEZONE="America/Sao_Paulo"\nSCHEDULED=true\nINACTIVE_EXPIRATION_TIME=2592000000 #30 DAYS\n
Run Code Online (Sandbox Code Playgroud)\n\n

100%覆盖率的单元测试结果:

\n\n
#CRON JOB\nFREQUENCY_CRON=\'30 00 * * *\'\nTIMEZONE="America/Sao_Paulo"\nSCHEDULED=true\nINACTIVE_EXPIRATION_TIME=2592000000 #30 DAYS\n
Run Code Online (Sandbox Code Playgroud)\n