使用sinon模拟一个日期对象

5

这是我的代码:

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');

然而,这会出现“尝试将未定义的属性toLocaleTimeString包装为函数”的错误。
请帮助我理解我应该如何桩接这种功能以及如何实现此操作的逻辑。
2个回答

10

你想要存根 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()

查看runkit示例。


非常好用。我花了很长时间在这上面,所以非常非常感谢你。 - Jeremy

0

我尝试了很多例子(如存根、useFakeTimers),但都没有起作用。将这个添加到我的测试套件中后,问题得到了解决;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接