与时间一起使用的规范问题

时间:2012-01-17 17:36:05

标签: ruby time rspec2

在我的规范中,我需要验证字符串是否正确转换为其他类型。其中包括TimeDateDateTime

测试适用于所有类型,包括Date,但在涉及Time时失败:

let(:type) { DateTime }
let(:date_time) { type.now }
let(:params) { [ date_time.to_s ] }

it 'should convert the parameters to dates/times' do
  # converted basically calls params.map { |param| type.parse param }
  converted.should == [date_time]
end

这实际上几乎有效:

expected: [#<DateTime: 2012-01-17T15:03:27-02:00 ((2455944j,61407s,568873440n),-7200s,2299161j)>]
     got: [#<DateTime: 2012-01-17T15:03:27-02:00 ((2455944j,61407s,0n),-7200s,2299161j)>] (using ==)

差异只有一个值,但我不知道究竟是什么意思。 Time测试的结果更令人困惑:

expected: [2012-01-17 15:03:27 -0200]
     got: [2012-01-17 15:03:27 -0200] (using ==)

测试之间的唯一区别是类型和描述。在一些跟踪之后,在我看来解析的时间没有微秒精度; usec始终返回0.

有关如何使这些规格通过的任何提示?

2 个答案:

答案 0 :(得分:3)

尝试使用formatting which excludes the fields that you do not want to compare比较他们的字符串表示(例如毫秒,微等)。

converted[0].iso8601(0).should == date_time.iso8601(0)

[编辑] 请注意,上面的示例比较了两个没有任何小数秒的日期时间(请参阅上面链接的iso8601文档)。

如果您真的想要比较DateTime对象本身,那么您的测试代码已经完成,您只需要修复您的实现,将小数秒部分调整为某个固定值(例如零)。

答案 1 :(得分:0)

更改了实施以使用当前时间的不太精确的版本:

  let(:type) { DateTime }
- let(:date_time) { type.now }
+ let(:date_time) { type.parse type.now.to_s }