间谍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的时间:
- Spy on Date.now在你的spec函数里(
it
function – 不是在beforeEach
)。 这样你的规格不会被延迟(也解释了为什么@ marco.jantke没有看到这个问题)。 - 如果你的testing代码使用定时器,使用
jasmine.Clock
。