【问题标题】:Jest testing function that involves current date涉及当前日期的笑话测试功能
【发布时间】:2019-10-02 03:25:16
【问题描述】:

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

import moment from "moment";

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

export default validateDate;

我的测试会是这样的:

import validateDate from "./index";

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

问题是测试将在 2019 年 5 月 17 日失败。如何解决这个问题?

我尝试了这个想法,但不确定它是否可以。

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

我的测试:

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

【问题讨论】:

标签: javascript node.js unit-testing jestjs


【解决方案1】:

我会尝试为测试提供动态日期。例如,第一个测试的日期为今天,第二个测试的日期为昨天,代码如下: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();
  })
});

【讨论】:

  • 你能写一些代码吗?为什么我的第二种方法不合适?
  • 我不喜欢您的第二种方法,因为您需要根据测试工作更改代码。
【解决方案2】:

您可以模拟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();
  });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2020-07-04
    • 1970-01-01
    • 2023-02-02
    相关资源
    最近更新 更多