jasmine spyOn on javascript new Date

时间:2015-06-02 17:15:47

标签: javascript angularjs unit-testing jasmine karma-jasmine

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

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

我们模拟Date对象的getTime()方法。但我想模仿新的Date()而不是。例如,我想测试的代码包含这一行

payload.created_at = new Date();

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

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

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

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:1)

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

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

上面代码的.and.callFake与上面链接中的代码存在差异。感谢