提问者:小点点

如何使用sinon在新Date()上添加存根?


我想验证各种日期字段是否被正确更新,但我不想在预测< code>new Date()何时被调用上浪费时间。我如何剔除日期构造函数?

import sinon = require('sinon');
import should = require('should');

describe('tests', () => {
  var sandbox;
  var now = new Date();

  beforeEach(() => {
    sandbox = sinon.sandbox.create();
  });

  afterEach(() => {
    sandbox.restore();
  });

  var now = new Date();

  it('sets create_date', done => {
    sandbox.stub(Date).returns(now); // does not work

    Widget.create((err, widget) => {
      should.not.exist(err);
      should.exist(widget);
      widget.create_date.should.eql(now);

      done();
    });
  });
});

如果相关,这些测试在节点应用程序中运行,我们使用TypeScript。


共3个答案

匿名用户

我想您需要useFakeTimers功能:

var now = new Date();
var clock = sinon.useFakeTimers(now.getTime());
//assertions
clock.restore();

这是普通的JS。一个工作的TypeScript/JavaScript示例:

var now = new Date();

beforeEach(() => {
    sandbox = sinon.sandbox.create();
    clock = sinon.useFakeTimers(now.getTime());
});

afterEach(() => {
    sandbox.restore();
    clock.restore();
});

匿名用户

sinon。useFakeTimers()由于某种原因破坏了我的一些测试,我不得不存根Date.now()

sinon.stub(Date, 'now').returns(now);

在这种情况下,在代码中而不是const now=new Date();你可以做

const now = new Date(Date.now());

或者考虑使用时刻库处理与日期相关的内容。短截距很容易。

匿名用户

当我正在寻找解决方案时,我发现了这个问题 如何模拟 Date 构造函数只有.我想在每个测试中使用相同的日期,但要避免模拟设置超时。西农在内部使用[lolex][1]我的解决方案是提供对象作为参数给正弦:

let clock;

before(() => {
    clock = sinon.useFakeTimers({
        now: new Date(2019, 1, 1, 0, 0),
        shouldAdvanceTime: true,
        toFake: ["Date"],
    });
})

after(() => {
    clock.restore();
})

您可以在[lolex][1]API[1]中找到其他可能的参数:https://github.com/sinonjs/lolex#api-参考