2

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

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

然后我尝试运行jasmine-node spec/,但它停止工作,没有输出。我不知道是什么原因。

4

2 回答 2

6

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

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

spyOn(Date, 'now').andReturn(1387636363717);
expect(Date.now()).toEqual(1387636363717);
于 2013-12-21T15:50:48.420 回答
1

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

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

如果您想停止测试时间:

  1. it在您的规范函数(函数 - 不是beforeEach)中监视 Date.now 。这样你的规范就不会被延迟(也解释了为什么@marco.jantke 没有看到这个问题)。
  2. 如果您的测试代码使用计时器,请使用jasmine.Clock.
于 2014-10-17T19:34:16.977 回答