如何在玩笑测试中模拟moment()

时间:2020-07-05 04:40:43

标签: javascript unit-testing testing jestjs momentjs

我需要使用笑话和片刻进行一些测试。一些导入的函数可以使用当前当前日期(moment())。但我似乎找不到一种始终运行相同日期进行测试或模拟时刻构造函数的方法,例如当前时刻为“ pin moment date”('2020-07-05'),即使当前日期为2020-07-10,因此测试应始终在第5天进行。

我的./UtilsModule文件:

import moment from 'moment'
export const getIntervalDates = groupOfDates => {
   const CURRENT_DATE = moment().format('YYYY-MM-DD');
   return getDates(CURRENT_DATE, groupOfDates ) //another function that does some extra processing;
};

export const nextDates = (date, group) => {
  let newDate= getIntervalDates(group);
}

我的test.js文件以及我尝试的目的:

import { nextDates ,getIntervalDates } from '../UtilsModule';
it('testing function', () => {
      const PAYLOAD = {...};
      const DATE= '2020-07-20';

      const SpyGetIntervalDates = jest.spyOn(UtilsModule, 'getIntervalDates');
      SpyGetIntervalDates.mockImplementation(() => Promise.resolve({ minAge: '2020-08-04' }));

      const nextDate = UtilsModule.nextDates(DATE, PAYLOAD);
      expect(nextDate).toEqual({ minDate: '2020-11-04' });
    });

我也尝试过,但是我无法使它起作用:

jest.mock('moment', () => {
  return () => jest.requireActual('moment')('2020-07-04');
});

and
global.moment = jest.fn(moment('2021-07-04'));

1 个答案:

答案 0 :(得分:0)

您试图通过模拟的+---------+ | name | +---------+ | Andy | | | | Dan | | | | Jackson | | | | Sally | | | +---------+ 函数测试nextDates函数。您需要进行一些重构,您应该为getIntervalDates内部调用的getIntervalDates函数保留相同的引用。然后,您可以使用nextDates用模拟的jest.spyOn代替。

例如

getIntervalDates

utilsModule.js

import moment from 'moment'; function getDates() {} const getIntervalDates = (groupOfDates) => { const CURRENT_DATE = moment().format('YYYY-MM-DD'); return getDates(CURRENT_DATE, groupOfDates); }; const nextDates = (date, group) => { return exports.getIntervalDates(group); }; exports.getIntervalDates = getIntervalDates; exports.nextDates = nextDates;

utilsModule.test.js

单元测试结果:

const UtilsModule = require('./utilsModule');

describe('62736904', () => {
  it('testing function', async () => {
    const PAYLOAD = {};
    const DATE = '2020-07-20';

    const SpyGetIntervalDates = jest.spyOn(UtilsModule, 'getIntervalDates');
    SpyGetIntervalDates.mockImplementation(() => Promise.resolve({ minAge: '2020-08-04' }));

    const nextDate = await UtilsModule.nextDates(DATE, PAYLOAD);
    expect(nextDate).toEqual({ minAge: '2020-08-04' });
  });
});