2

我有一个严重依赖时间的应用程序。为了使测试更容易,我希望能够在特定时间点启动我的节点应用程序。

NODE_FAKE_TIME=true node app.js 

我在我的 app.js 中使用了类似的东西

if(process.env.NODE_FAKE_TIME) { 
  var time = parseInt(moment(moment().format('YYYY-MM-DD 04:00:00')).format('XSSS'));
  var clock = sinon.useFakeTimers(time, "Date");    
}

但是,除了使用 sinon 的 useFakeTimers 之外,还有更好的方法吗?因为这样做确实会改变时钟时间......但是它会影响其他东西,如 setIntervals 和 setTimeOuts。

我只想要一种干净的方式来指定应用程序眼中的时间,所以在我使用 Date.now 的任何地方,它都会超出我在运行时指定的时间。

谢谢,

4

2 回答 2

3

我在单元测试中通过直接替换 Date 上的方法来完成此操作:

    var oldNow = Date.now;
    var oldGetTime = Date.prototype.getTime;

    Date.now = function() { return 0; }
    Date.prototype.getTime = Date.now;

以上将自 1970 年 1 月 1 日 00:00:00 以来的时间设置为零 - 只需将返回的值替换为您感兴趣的时间。

于 2013-08-27T16:14:22.807 回答
0

我发现最好的方法是使用 var clock = sinon.useFakeTimers(date, "Date"); 然后使用clock.tick(1000)。

允许您通过在时间戳中提供日期然后指定刻度之间的 MS 数来指定运行时的日期。

例子:

  var time = some_timestamp_here;
  var clock = sinon.useFakeTimers(time, "Date");

  // Every second tick the clock ahead one hour
  setInterval(function(){
    clock.tick(3600000);
  }, 1000);
于 2013-08-28T23:34:05.593 回答