我的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
答案 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只是方法而不是对象的真实表示。