【问题标题】:Spy on Date.now() results in jasmine-node not responding监视 Date.now() 导致 jasmine-node 没有响应
【发布时间】:2014-01-10 06:59:18
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    如果您想停止测试时间:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我的代码和你的代码完全一样。我的 jasmine-node 版本是 1.12.0
      • 我也试过 jasmine-node 1.11.0,同样的问题。操作系统是 Ubuntu 12。不知道为什么监视 Date.now 会导致 jasmine-node 无法正常工作。
      猜你喜欢
      • 1970-01-01
      • 2010-12-21
      • 2012-03-19
      • 2014-05-10
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多