涉及当前日期的笑话测试功能

时间:2019-05-15 04:07:48

标签: javascript node.js unit-testing jestjs

我有一个检查参数与今天是否相同的函数,在我的函数中,我像这样使用new Date()

import validateDate from "./index";

it("is same or after today", () => {
  expect(validateDate({ date: "16-05-2019" })).toBeTruthy();
});

我的测试将如下:

const validateDate = ({ date, today = new Date() }) => {
      return moment(date, "DD-MM-YYYY").isSameOrAfter(
        moment(today, "DD-MM-YYYY", "days")
      );
    };

问题是,测试将在17-05-2019失败。如何解决这个问题?

我尝试过这个想法,但不确定是否合适。

expect(validateDate({ date: "16-05-2019" }, today: new Date())).toBeTruthy();

我的测试:

{{1}}

2 个答案:

答案 0 :(得分:1)

您可以模拟Date对象,以确保new Date()返回条件日期。

global.Date = class extends RealDate {
  constructor() {
    super();
    return new RealDate(isoDate);
  }
};

只需在测试之前覆盖全局Date对象,然后在完成测试后还原即可。

最终代码:

describe("validateDate", () => {
  const RealDate = Date;

  function mockDate(isoDate) {
    global.Date = class extends RealDate {
      constructor() {
        super();
        return new RealDate(isoDate);
      }
    } as any;
  }

  afterEach(() => {
    global.Date = RealDate;
  });

  it("should return true", () => {
    mockDate(moment("15-05-2019", "DD-MM-YYYY").toISOString());
    expect(validateDate({date: "16-05-2019", today: new Date()})).toBeTruthy();
  });
});

答案 1 :(得分:0)

我会尝试为测试提供动态日期。例如,第一个测试将以今天作为日期,而第二个测试将以昨天为日期,其代码如下:moment().subtract(1, 'days').valueOf()

更详细的示例:

desc("is same or after today", () => {
  it('should return true for today', () => {
    expect(validateDate({
      date: moment().format('DD-MM-YYYY').valueOf()
    })).toBeTruthy();
  })

  it('should return true for yesterday', () => {
    expect(validateDate({
      date: moment().subtract(1, 'days').format('DD-MM-YYYY').valueOf()
    })).toBeTruthy();
  })
});