【问题标题】:jasmine spyOn on javascript new Datejasmine spyOn on javascript new Date
【发布时间】:2015-08-16 14:59:28
【问题描述】:

我在 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。所以我想告诉 jasmine,每当你看到 new Date() 时,用我给你的给定日期替换它。所以我在想类似的东西,但它不起作用。

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

但是 new Date 不是 Date 的方法。请问有人可以帮我解决这个问题吗?谢谢

【问题讨论】:

  • 我试过了,没用。它给了我一个未定义的错误
  • 什么未定义的错误?
  • @PSL ,不用担心,该链接帮助我找到了答案。我发布了我的答案。谢谢
  • 好的。这只是茉莉花版本的区别(你应该已经知道了,因为在你正在做的问题and.callFake)。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-10-29
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      相关资源
      最近更新 更多