5

我的 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
4

3 回答 3

5

我对您在这里测试的内容有点困惑。如果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

这对我来说很好。

于 2013-10-16T14:35:17.787 回答
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())
于 2014-03-18T22:07:55.423 回答
2

日期时间类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 只是一个方法,而不是对象的真实表示。

于 2013-10-16T14:33:34.023 回答