admin管理员组

文章数量:815076

用Jest测试节点计划作业功能

我有一个javascript类,其中包含一个使用node-cron库启动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

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

回答如下:

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

例如

cronJob.js

import cron from 'node-cron';

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

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

export default new CronJob();

cronJob.test.js

import cron from 'node-cron';
import path from 'path';

require('dotenv').config({ path: path.resolve(__dirname, './.env') });

jest.mock('node-cron', () => {
  return {
    schedule: jest.fn(),
  };
});

describe('61765291', () => {
  it('should pass', () => {
    const logSpy = jest.spyOn(console, 'log');
    cron.schedule.mockImplementationOnce(async (frequency, callback) => await callback());
    require('./cronJob');
    expect(logSpy).toBeCalledWith('DO SOME DATA PROCESSING');
    expect(cron.schedule).toBeCalledWith('30 00 * * *', expect.any(Function), {
      scheduled: 'true',
      timezone: 'America/Sao_Paulo',
    });
  });
});

.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
    ✓ should pass (30ms)

  console.log
    DO SOME DATA PROCESSING

      at CustomConsole.<anonymous> (node_modules/jest-environment-enzyme/node_modules/jest-mock/build/index.js:866:25)

------------|---------|----------|---------|---------|-------------------
File        | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
------------|---------|----------|---------|---------|-------------------
All files   |     100 |      100 |     100 |     100 |                   
 cronJob.js |     100 |      100 |     100 |     100 |                   
------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        9.145s, estimated 10s

本文标签: 用Jest测试节点计划作业功能