在我的规范中,我需要验证字符串是否正确转换为其他类型。其中包括Time
,Date
和DateTime
。
测试适用于所有类型,包括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.
有关如何使这些规格通过的任何提示?
答案 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 }