rspec - 如何与expect中的实际DateTime进行比较?

时间:2013-10-16 14:24:30

标签: ruby rspec

我的rspec:

it "can show the current month name" do
  expect(Calendar.create_date_using_month(1)).to eq '2000-01-01 00:00:00 -0500'
end

失败了:

expected: "2000-01-01 00:00:00 -0500"
     got: 2000-01-01 00:00:00 -0500

我的代码:

def self.create_date_using_month(n)
  Time.new(2000,n,1)
end

我应该/可以更改RSpec,以便我与实际字符串进行比较而不是日期吗?

我试过了:Date.strptime("{ 2000, 1, 1 }", "{ %Y, %m, %d }")

但是这给了我

   expected: #<Date: 2000-01-01 ((2451545j,0s,0n),+0s,2299161j)>
        got: 2000-01-01 00:00:00 -0500

3 个答案:

答案 0 :(得分:4)

我对你在这里测试的内容感到有点困惑。如果create_data_using_month创建了Time对象,则应将其与Time对象进行比较。

此消息:

expected: "2000-01-01 00:00:00 -0500"
     got: 2000-01-01 00:00:00 -0500 

告诉你它期望带有日期的文字字符串,但是得到了一个to_s恰好相同的对象。

所以我想你可以通过改变它来“修复”它:

it "can show the current month name" do
  expect(Calendar.create_date_using_month(1).to_s).to eq '2000-01-01 00:00:00 -0500'
end

但这看起来很奇怪,那就是你想要的吗?如果您在具有不同时区设置的计算机上进行测试,也可能会出现问题。

我只是这样做:

it "can show the current month name" do
  expect(Calendar.create_date_using_month(1)).to eq Time.new(2000, 1, 1)
end

对我来说很好。

答案 1 :(得分:3)

我认为你有一个微秒的问题。

您应该使用to_i转换日期以避免处理微秒问题(如果不相关)。

Time.now().to_i.should == Time.now().to_i

我确实认为这项工作也是

Time.now().should.eql?(Time.now())

我还写了一个自定义匹配器:

RSpec::Matchers.define :be_equal_to_time do |another_date|
  match do |a_date|
    a_date.to_i.should == another_date.to_i
  end
end

可以像这样使用

Time.now().should be_equal_to_time(Time.now())

答案 2 :(得分:2)

DateTime Class http://www.ruby-doc.org/stdlib-1.9.3/libdoc/date/rdoc/DateTime.html

DateTime.parse('2000-01-01 00:00:00 -0500') == DateTime.new(2000,1,1,0,0,0,'-5')
#=> true

除非您专门测试其返回特定字符串的能力,否则您应该总是尝试比较对象而不是它的字符串值。这是因为to_s只是方法而不是对象的真实表示。