如何使用 sinon 存根 new Date()?
How do I stub new Date() using sinon?
我想验证各种日期字段是否已正确更新,但我不想在预测 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。
我怀疑你想要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();
});
我在寻找解决方案如何仅模拟 Date
构造函数时发现了这个问题。
我想在每个测试中使用相同的日期,但要避免嘲笑 setTimeout
。
诗乃在内部使用 [lolex][1]
我的解决方案是将对象作为参数提供给 sinon:
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-reference
sinon.useFakeTimers()
由于某种原因破坏了我的一些测试,我不得不存根 Date.now()
sinon.stub(Date, 'now').returns(now);
在那种情况下,您可以在代码中代替 const now = new Date();
const now = new Date(Date.now());
或者考虑使用 moment 库来处理日期相关的内容。卡住的时刻很容易。
我想验证各种日期字段是否已正确更新,但我不想在预测 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。
我怀疑你想要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();
});
我在寻找解决方案如何仅模拟 Date
构造函数时发现了这个问题。
我想在每个测试中使用相同的日期,但要避免嘲笑 setTimeout
。
诗乃在内部使用 [lolex][1]
我的解决方案是将对象作为参数提供给 sinon:
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-reference
sinon.useFakeTimers()
由于某种原因破坏了我的一些测试,我不得不存根 Date.now()
sinon.stub(Date, 'now').returns(now);
在那种情况下,您可以在代码中代替 const now = new Date();
const now = new Date(Date.now());
或者考虑使用 moment 库来处理日期相关的内容。卡住的时刻很容易。