如何使用sinon存根新的Date()?

问题描述 投票:30回答:3

我想验证各种日期字段是否已正确更新,但我不想在调用new Date()时预测。如何删除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。

javascript testing sinon stub
3个回答
60
投票

我怀疑你想要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();
});

1
投票

当我想要解决如何模拟Date构造函数时,我发现了这个问题。我想在每次测试中使用相同的日期,但要避免嘲笑setTimeout。 Sinon正在内部使用lolex我的解决方案是将对象作为参数提供给sinon:

let clock;

before(async function () {
    clock = sinon.useFakeTimers({
        now: new Date(2019, 1, 1, 0, 0),
        shouldAdvanceTime: true,
        advanceTimeDelta: 20
    });
})

after(function () {
    clock.restore();
})

您可以在lolex API中找到其他可能的参数


1
投票

由于某种原因,sinon.useFakeTimers()打破了我的一些测试,我不得不把Date.now()留下来

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

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

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

或者考虑使用moment库来选择与日期相关的东西。准确的时刻很容易。

© www.soinside.com 2019 - 2024. All rights reserved.