模拟今天只在Jasmine单元测试中的日期

时间:2016-01-27 17:20:00

标签: javascript angularjs jasmine

我正在为比较日期的函数编写Jasmine单元测试。我想提供一个假日期用于今天的日期。因此,我正在监视窗口对象上的import 'rxjs/Rx'; 方法并返回预定义的日期。

这很好用,但在我测试的函数中,我也是从字符串中读取日期并调用Date将它们变成日期。发生这种情况时,这些值将替换为我提供的模拟日期。

以下是一个例子:

new Date(yyyy, mm, dd)

Here's a JSFiddle example of the issue.

我如何只模拟今天的日期,并允许var checkDate = function () { return { today: new Date(), anotherDay: new Date(2016, 0, 1) } }; var createDate = function (year, month, date) { var overrideDate = new Date(year, month, date); spyOn(window, 'Date').andCallFake(function () { return overrideDate; }) } var dates; describe("checkDate", function() { beforeEach(function() { createDate(2015, 11, 1); dates = checkDate(); }) it("today has a value of 12/1/2015", function() { expect(dates.today.toLocaleDateString()).toBe('12/1/2015'); }); it("anotherDay has a value of 1/1/2016", function() { expect(dates.anotherDay.toLocaleDateString()).toBe('1/1/2016'); }) }); 创建正确的日期对象?我希望小提琴中的两个测试都通过,即new Date(yyyy, mm, dd)设置为anotherDay1/1/2016设置为today

Karma-Jasmine v 0.1.6。

2 个答案:

答案 0 :(得分:2)

您可以缓存window.Date以在将参数传递到模拟

时使用它
var windowDate = window.Date;
spyOn(window, 'Date').andCallFake(function (year,month,day) {
    if(year != undefined && month != undefined && day != undefined){
        return new windowDate(year,month,day);
        }
  return overrideDate;
})

https://jsfiddle.net/n3Lf0g8p/1/

答案 1 :(得分:1)

最好使用Jasmine Clock API

beforeEach(() => {
  const fixedDate = new Date(2020, 0, 1);
  jasmine.clock().install();
  jasmine.clock().mockDate(fixedDate);
});

afterEach(() => {
  jasmine.clock().uninstall();
});

src:https://stackoverflow.com/a/48574541