我有一个检查参数与今天是否相同的函数,在我的函数中,我像这样使用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}}
答案 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();
})
});