我正在使用 jasmine-node 进行单元测试。我做了下面的代码来模拟 Date.now()
spyOn(Date, 'now').andReturn(1387636363717); //always return a fixed time
然后我尝试运行jasmine-node spec/
,但它停止工作,没有输出。我不知道是什么原因。
我正在使用 jasmine-node 进行单元测试。我做了下面的代码来模拟 Date.now()
spyOn(Date, 'now').andReturn(1387636363717); //always return a fixed time
然后我尝试运行jasmine-node spec/
,但它停止工作,没有输出。我不知道是什么原因。
我写了一个小测试。它工作得很好。在 1.11.0 版本中使用 jasmin-node。
你的 Date.now 函数在哪里使用呢?
spyOn(Date, 'now').andReturn(1387636363717);
expect(Date.now()).toEqual(1387636363717);
问题是节点运行时(timers.js
)中有代码调用Date.now()
来标记时间的流逝。如果您的代码设置了一个计时器 ( setTimeout
) 并且该代码在不使用时执行,那么您可能会发现 node.js 在执行下一个真正的超时jasmine.Clock
之前等待一段时间过去。由于此代码似乎是从外部 javascript 领域调用的,因此您不能依赖 javascript 的单线程特性来保证您的安全。通过在spy 上设置断点,我可以看到规范的执行被无限期暂停,等待一毫秒过去。.andCallFake
Date.now
这对我来说是个问题,因为我们有一个非常大的单元测试套件,并且有可能setTimeout
被称为某些其他调用的副作用,并且jasmine.Clock
并非在每个规范中都普遍使用。由于这是优化的副作用(注意:评论中的“开销太大”),我认为这是 node.js 中的一个错误。
如果您想停止测试时间:
it
在您的规范函数(函数 - 不是beforeEach
)中监视 Date.now 。这样你的规范就不会被延迟(也解释了为什么@marco.jantke 没有看到这个问题)。jasmine.Clock
.