我正在尝试(并且失败!)以下代码来比较RSpec中的两个Time对象:
describe '#current_shift_datetime' do
subject { WipStack.current_shift_datetime }
it "To be a Time object" do
expect(subject).to be_kind_of(Time)
end
it "To return current shift datetime" do
# Trying to figure out why they are not equal
puts subject.in_time_zone.round
puts 0.day.ago.midnight.in_time_zone.round
# Problematic code here -->
expect(subject.in_time_zone.round).to be_equal(0.day.ago.midnight.in_time_zone.round)
# End of problematic code
end
end
我已经在互联网上阅读了关于rspec时间比较的一些内容,其中一个用毫秒(因此是圆形)来解释问题,另一个页面讨论stub
,但后来以{{1}结尾}}
测试的输出是:
An error occurred in an after hook SystemStackError: stack level too deep
看跌期权输出:
1) WipStack#current_shift_datetime To return current shift datetime
Failure/Error: expect(subject.in_time_zone.round).to be_equal(0.day.ago.midnight.in_time_zone.round)
expected equal?(Mon, 17 Feb 2014 00:00:00 CST -06:00) to return true, got false
更新
以下是#current_shift_datetime
To be a Time object
2014-02-17 00:00:00 -0600
2014-02-17 00:00:00 -0600
To return current shift datetime (FAILED - 1)
方法:
current_shift_datetime
答案 0 :(得分:2)
不是直接比较时区(并且在细微的差异中陷入困境),你可以尝试将字符串表示相互比较,因为无论如何,这是你在控制台中检查的内容。
根据您在应用中使用此时区的方式,这应该足以说明它们基本上是同一时间。
expect(subject.in_time_zone.round.to_s).to eq(0.day.ago.midnight.in_time_zone.round.to_s)
如果您愿意,也可以删除.round
。
修改强>
尝试更改代码,以便在打印内容和比较内容之间没有区别:
it "To return current shift datetime" do
a = subject.in_time_zone.round.to_s
b = 0.day.ago.midnight.in_time_zone.round.to_s
puts a
puts b
expect(a).to eq(b)
end
答案 1 :(得分:0)
我修复它感谢tyler!
似乎be_equal实际上试图查看两个对象是否相同(在比较字符串时测试中出现的注释失败),将be_equal更改为eq使得测试通过!
it "To return current shift datetime" do
#pending
puts subject.in_time_zone.round.to_s
puts 0.day.ago.midnight.in_time_zone.round.to_s
expect(subject.in_time_zone.round.to_s).to eq(0.day.ago.midnight.in_time_zone.round.to_s)
end