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
在本地通过CircleCI时,我不断收到类似的错误消息。
这里是一些例子:
(1)
expected: 2015-05-09 10:42:59.752192641 +0000
got: 2015-05-09 10:42:59.752192000 +0000
(2)
expected: 2015-05-08 10:16:36.777541226 +0000
got: 2015-05-08 10:16:36.777541000 +0000
从错误中,我怀疑CircleCI将时间戳值舍入,但我没有足够的信息。 有什么建议么?
我遇到了同样的问题,并且目前有CircleCI的公开门票以获取更多信息。 当我知道更多时,我会更新这个答案。
与此同时,传递这些测试的解决方法只是为了确保在这样的测试中使用的时间戳是使用嘲讽时间的库(如timecop
)进行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
更新:根据CircleCI的初步回应,上述方法实际上是他们推荐的方法。 尽管如此,他们还没有能够给我一个解释,为什么四舍五入实际上正在发生。
更新2:看起来这与不同系统之间的精度差异有关。 我个人在OS X上看到了这个问题。以下是Circle的回应:
据我所知,Time.now实际上在OS X和Linux机器上具有不同的精度。 我会假设你会在其他Linux主机上得到完全相同的结果,但所有OS X主机都会给你结果而不舍入。 我可能是错的,但我记得与另一位客户谈论此事。 请注意在运行Linux的虚拟机或EC2实例上进行检查?
在时间参考中,您可以在页面上搜索精度 - 圆的方法实际上可以为您调整精度。 考试内的断言时间是否可以作为选项?
我还没有尝试过他们的建议还没有确认,但是这似乎提供了一个解释以及一个额外的解决方法(将测试中的断言舍入),这不需要时间timecop
。