Ruby on rails CircleCI:涉及时间戳的规范错误
我有一个返回ActiveRecord对象时间戳的方法规范 该规范在本地通过,但无论何时在CircleCI上运行,预期与实际之间都存在轻微的不匹配 该规范如下所示:Ruby on rails CircleCI:涉及时间戳的规范错误,ruby-on-rails,rspec,circleci,Ruby On Rails,Rspec,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 当它在本地传递
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上,我不断收到类似的错误消息
以下是一些例子:
(一)
(二)
从错误中,我怀疑CircleCI正在对时间戳值进行取整,但我没有足够的信息。有什么建议吗?我遇到了同样的问题,目前正在与CircleCI联系以获取更多信息。当我知道更多时,我会更新这个答案 同时,让这些测试通过的一个解决方法就是确保您在这样的测试中使用的时间戳是使用模拟时间的库取整的(比如
timecop
)
更新:根据CircleCI的初始响应,上述方法实际上是他们推荐的方法。不过,他们还没能给我一个解释,解释为什么四舍五入会发生
更新2:这似乎与不同系统之间的精度差异有关。我个人在OS X上看到了这个问题。下面是Circle的回应:
据我所知,Time.now在OSX上的精度实际上有所不同
和Linux机器。我想你也会得到同样的结果
在其他Linux主机上的结果,但所有OS X主机都将为您提供
结果不四舍五入。我可能错了,但我记得我说过
和另一个顾客的关系。介意在VM或EC2上检查一下吗
运行Linux的实例
在时间参考中,您可以在页面上搜索精度
圆形方法实际上可以为您调整精度。这会是一场灾难吗
您是否可以选择在测试中对断言中的时间进行舍入
我还没有尝试他们的建议来确认,但这似乎提供了一个解释以及一个额外的解决方法(在测试中舍入断言),不需要
timecop
您还可以在模式中定义时间列的精度,这样,ActiveRecord将负责类型转换时的精度截断
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
请参见向Circle CI支持人员报告问题的最佳方法;他们可能有更好的装备来解释正在发生的事情。我最终切换到rspec匹配器
be\u in
expected: 2015-05-08 10:16:36.777541226 +0000
got: 2015-05-08 10:16:36.777541000 +0000
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