CircleCI:包含时间戳的规范的错误

Sun*_*Cho 10 rspec ruby-on-rails circleci

我有一个方法的规范,返回ActiveRecord对象的时间戳.

规范在本地传递,但无论何时在CircleCI上运行,预期与实际之间都会略有不匹配.

规范看起来像这样:

describe '#my_method' do
  it 'returns created_at' do
    object = FactoryGirl.create(:something)
    expect(foo.bar(object)).to eq object.created_at
  end
end
Run Code Online (Sandbox Code Playgroud)

当它在本地传递时,在CircleCI上,我不断得到类似的错误消息.

以下是示例:

(1)

expected: 2015-05-09 10:42:59.752192641 +0000
got: 2015-05-09 10:42:59.752192000 +0000
Run Code Online (Sandbox Code Playgroud)

(2)

expected: 2015-05-08 10:16:36.777541226 +0000
got: 2015-05-08 10:16:36.777541000 +0000
Run Code Online (Sandbox Code Playgroud)

从错误中,我怀疑CircleCI正在计算时间戳值,但我没有足够的信息.有什么建议?

jos*_*arh 7

我遇到了同样的问题,目前与CircleCI有一张开放票,以获取更多信息.当我知道更多时,我会更新这个答案.

与此同时,让这些测试通过的解决方法只是确保您在这样的测试中使用的时间戳使用模拟时间的库(如timecop)进行舍入.

describe '#my_method' do
  it 'returns created_at' do
    # CircleCI seems to round milliseconds, which can result in 
    # slight differences when serializing times.
    # To work around this, ensure the millseconds end in 000.

    Timecop.freeze(Time.local(2015)) do
      object = FactoryGirl.create(:something)
      expect(foo.bar(object)).to eq object.created_at
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

更新:基于CircleCI的初始响应,上述方法实际上是他们推荐的方法.然而,他们还没有能够解释为什么实际上正在进行舍入.

更新2:看起来这与不同系统之间的精度差异有关.我个人在OS X上看到了这个问题.以下是Circle的回复:

据我所知,Time.now在OS X和Linux机器上实际上有不同的精度.我想你会在其他Linux主机上获得完全相同的结果,但是所有OS X主机都会给你结果而不进行舍入.我可能错了,但我记得和另一位客户谈过这件事.请注意在运行Linux的VM或EC2实例上检查?

在时间参考中,您可以在页面上搜索精度 - 圆形方法实际上可以为您调整精度.您是否可以选择在测试中断言时间?

我还没有尝试过他们的建议,但是这似乎提供了一个解释以及一个额外的解决方法(在测试中舍入断言),这不需要timecop.

  • 将时间冻结到 usec 对我来说不起作用。我最终切换到 rspec 匹配器“be_within” (2认同)