用Jasmine模拟日期构造函数

Rim*_*ian 26 javascript mocking jasmine

我正在测试一个将日期作为可选参数的函数.我想声明如果在没有参数的情况下调用函数,则会创建一个新的Date对象.

var foo = function (date) {
  var d = date || new Date();
  return d.toISOString();
}
Run Code Online (Sandbox Code Playgroud)

我如何断言new Date被称为?

到目前为止,我有这样的事情:

it('formats today like ISO-8601', function () {
  spyOn(Date, 'prototype');
  expect().toHaveBeenCalled();
});
Run Code Online (Sandbox Code Playgroud)

请参阅:https://github.com/pivotal/jasmine/wiki/Spies

Ana*_*mer 58

来自茉莉花的例子,

jasmine.clock().install();
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();
});
Run Code Online (Sandbox Code Playgroud)

茉莉花的约会

  • 这应该是该问题的公认答案。 (2认同)

小智 13

归功于@HMR.测试我写的验证:

  it('Should spy on Date', function() {
    var oldDate = Date;
    spyOn(window, 'Date').andCallFake(function() {
      return new oldDate();
    });
    var d = new Date().toISOString;
    expect(window.Date).toHaveBeenCalled();
  });
Run Code Online (Sandbox Code Playgroud)

  • 这会破坏 Date.now() 之类的东西。不要使用它。 (3认同)
  • 对于使用Edge版*Jasmine*的用户:`it('应监视日期',函数(){var oldDate = Date; // and.callFake spyOn(window,'Date').and.callFake( function(){return new oldDate();}); var d = new Date().toISOString; expect(window.Date).toHaveBeenCalled();}); ` (2认同)
  • 这不是要走的路!!使用 jasmine.clock() 代替 (2认同)

ces*_*hon 7

对我来说它适用于:

spyOn(Date, 'now').and.callFake(function() {
    return _currdate;
  });
Run Code Online (Sandbox Code Playgroud)

而不是.andCallFake(使用"grunt-contrib-jasmine":"^ 0.6.5",这似乎包括jasmine 2.0.0)


小智 6

对我来说,它只需要使用mockDate()而不使用其他任何东西就可以工作:

jasmine.clock().mockDate(new Date('2000-01-01T01:01:01'));
Run Code Online (Sandbox Code Playgroud)