使用sinon来模拟日期对象

时间:2017-08-16 21:36:33

标签: javascript date sinon

这是我的代码:

var startTime = new Date(startDateTime).toLocaleTimeString("en-US", options);

我需要在单元测试中获得startTime。从java角度知道单元测试,我会将此问题解决为如何模拟新的日期构造函数?然后如何模拟toLocaleTimeString函数调用?。但是,我不确定这是在javascript中解决这个问题的方法。

我尝试了几件事,包括sinon的useFakeTimers,但我不认为这是相关的,因为我实际上对时间的推移并不感兴趣。

这是我的测试代码,现在正在大量的谷歌上搜索,没有关于sinon如何工作的背景:

var whatever = sinon.spy(global, 'Date');
sinon.stub(whatever, 'toLocaleTimeString').yields('7:00 PM');

但是,这会产生错误“尝试将未定义的属性包装为LocaleTimeString作为函数”。

请帮助我理解我如何制定这类功能以及如何操作这些功能背后的逻辑。

2 个答案:

答案 0 :(得分:2)

您希望存根Date的原型,因此当您创建新的Date时,它会附带存根:

const stub = sinon.stub(Date.prototype, 'toLocaleTimeString').returns('7:00 PM')
new Date().toLocaleTimeString("en-US")
stub.restore() // or Date.prototype.toLocaleTimeString.restore()

See the runkit example.

答案 1 :(得分:0)

许多示例都没有对我有用(存根,useFakeTimers)。将此添加到我的测试套件中;

Date.prototype.toLocaleTimeString = sinon
    .stub()
    .callsFake(() => '7:00 PM');