jasmine spyOn javascript 新日期

jasmine spyOn on javascript new Date

我正在 angulajs 中对我的客户端代码进行单元测试,我理解这段代码的意思

 var newdate = new Date(2013,6,29);
    spyOn(Date.prototype, 'getTime').and.callFake(function() {
          return newdate;
        });

我们模拟了 Date 对象的 getTime() 方法。但我想改为模拟 new Date() 。例如我要测试的代码包含这一行

payload.created_at = new Date();

我无权访问 payload.created_at。所以我想告诉茉莉花,每当你看到新的 Date() 时,用我给你的给定日期替换它。所以我在想类似的东西,但它不起作用。

spyOn(Date.prototype, 'new Date').and.callFake(function() {
          return newdate;
        });

但新日期不是日期的方法。有人可以帮我解决这个问题吗?谢谢

所以这个 link [Mock date constructor with Jasmine 有答案,但由于某种原因它对我不起作用。我想这可能与我的茉莉花版本有关,但下面是对我有用的代码

var oldDate = new Date();
    spyOn(window, 'Date').and.callFake(function() {
      return oldDate;
    });

上面代码的.and.callFake和上面的link有区别。谢谢

Jasmine Clock api 允许您伪造 JavaScript 日期功能,而无需手动为其编写间谍程序。

请特别阅读有关 mocking the date 的部分。

describe("Mocking the Date object", function(){
    beforeEach(function() {
      jasmine.clock().install();
    });

    it("mocks the Date object and sets it to a given time", function() {
      var baseTime = new Date(2013, 9, 23);

      jasmine.clock().mockDate(baseTime);

      jasmine.clock().tick(50);
      expect(new Date().getTime()).toEqual(baseTime.getTime() + 50);
    });

    afterEach(function() {
      jasmine.clock().uninstall();
    });
});