javascript - Jest 测试涉及当前日期的函数

标签 javascript node.js unit-testing jestjs

我有一个函数可以检查参数是否与今天相同或晚于今天,在我的函数中我使用了 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();
});

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

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

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

最佳答案

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

关于javascript - Jest 测试涉及当前日期的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56141629/

相关文章:

javascript - 陷入 Javascript 无限 while 循环

node.js - 无法从Docker容器连接到Redis

scala - 如何在 Scala Slick 中模拟数据库

javascript - 如何模拟在另一个导入中导入的方法

javascript - 与 prevState 比较的 componentDidUpdate 正在替代触发器上工作

javascript - 如何仅对 Angular 中的某些变量使用父范围,并保持其他变量隔离

javascript - 如何在 PlyrJS 中添加两个视频

node.js - Promise.all() 不等待异步进程

javascript - 从 JSON 文件创建简单的 Node.js API

database - 如何组织实时数据完整性测试和代码单元测试?