间谍日期.now()导致jasmine-node没有响应

时间:2013-12-21 14:45:11

标签: node.js unit-testing mocking jasmine jasmine-node

我正在使用jasmine-node进行单元测试。我在下面的代码中做了模拟Date.now()

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

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

2 个答案:

答案 0 :(得分:5)

我写过一个很小的测试。它工作得很好。在1.11.0版中使用jasmin-node。

然后使用Date.now函数在哪里?

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

答案 1 :(得分:0)

问题是节点运行时(timers.js)中有代码调用Date.now()来标记时间的流逝。如果您有设置计时器(setTimeout)的代码并且在不使用jasmine.Clock时执行该代码,那么您可能会发现node.js在执行下一个之前等待一段时间真正的超时。由于此代码似乎是从外部javascript域调用的,因此您无法依赖 关于javascript的单线程性质,以保证您的安全。通过在.andCallFake间谍的Date.now上放置一个断点,我能够看到规范的执行被无限期暂停,等待毫秒才能通过。

这对我来说是一个问题,因为我们有一个非常大的单元测试套件,并且有可能setTimeout被调用作为其他一些调用的副作用,并且jasmine.Clock并非普遍使用规范。由于这是优化的副作用(注意:评论中的'开销太大'),我认为这是node.js中的错误。

如果您想停止测试时间:

  1. 在规范函数中隐藏Date.now(it函数 - 而不是beforeEach)。这样你的规范就不会延迟(也解释了为什么@ marco.jantke没有看到这个问题)。
  2. 如果您的测试代码使用计时器,请使用jasmine.Clock