RSpec - 期望等于?(时间对象)返回true,得到假

时间:2014-02-17 16:58:25

标签: ruby-on-rails ruby ruby-on-rails-3 rspec

我正在尝试(并且失败!)以下代码来比较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

2 个答案:

答案 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