间谍Date.now()导致茉莉花节点没有响应

我正在使用茉莉节点做unit testing。 我做了下面的代码嘲笑Date.now()

spyOn(Date, 'now').andReturn(1387636363717); //always return a fixed time 

然后我试图运行jasmine-node spec/但它停止工作,没有输出。 我无法弄清楚是什么原因。

我写了一个小testing。 它工作得很好。 在版本1.11.0中使用jasmin-node。

你的Date.now函数在哪里呢?

 spyOn(Date, 'now').andReturn(1387636363717); expect(Date.now()).toEqual(1387636363717); 

问题是节点运行时( timers.js )中有代码调用Date.now()来标记时间的stream逝。 如果你有设置一个定时器( setTimeout )的代码,并且在不使用jasmine.Clock情况下执行代码,那么你可能会发现node.js在执行下一个实际的超时之前需要等待一段时间才能通过。 由于这段代码似乎是从外部的JavaScript土地调用,你不能依靠JavaScript的单线程的性质,以保持你的安全。 通过在Date.now间谍的.andCallFake上放置一个断点,我能够看到规范的执行被无限期地暂停,等待一个毫秒的时间。

这对我来说是一个问题,因为我们有一个非常大的unit testing套件,有可能setTimeout被称为一些其他调用和jasmine.Clock 。在每个规范中并没有普遍使用jasmine.Clock 。 由于这是优化的副作用(注意:在注释中“开销过多”),我认为这是node.js中的一个bug。

如果你想停止testing的时间:

  1. Spy on Date.now在你的spec函数里( itfunction – 不是在beforeEach )。 这样你的规格不会被延迟(也解释了为什么@ marco.jantke没有看到这个问题)。
  2. 如果你的testing代码使用定时器,使用jasmine.Clock