rspec 期望日期等于

Zac*_*ack 4 ruby json rspec ruby-on-rails

我有一个名为工作订单的对象,它具有以下架构:

# == Schema Information
#
# Table name: work_orders
#
#  id                 :integer          not null, primary key
#  due_on             :date
#  name               :string(255)
Run Code Online (Sandbox Code Playgroud)

显示对象时我还有一个 Json 输出:

{
   id: 1,
   due_on: "2015-06-08",
   name: "my work order"
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用 rspec 来确认 json 显示的日期与对象的日期匹配。这是我为其他物体做过 50 次的事情......

我有以下内容:

exemplar = FactoryGirl.create(:work_order)
...
puts "Test: #{exemplar.due_on}"
expect(exemplar.name).to      eq(hash['name'])   #This works fine!
expect(exemplar.due_on).to    eq(hash['due_on']) #This blows up...
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

Test: 2015-06-08

expected: "2015-06-08"
     got: Mon, 08 Jun 2015
Run Code Online (Sandbox Code Playgroud)

我不明白“Mon, 08 Jun 2015”是从哪里来的。当我用 put 语句打印出日期时,它显示为 2015-06-08...

Ste*_*fan 5

Rails 将字符串转换为日期对象。2015-06-08是以下的输出Date#to_s

d = Date.today
#=> Thu, 17 Jul 2014

puts d
#=> 2014-07-17
Run Code Online (Sandbox Code Playgroud)

您可以使用以下任一方法将日期对象与字符串进行比较:

expect(exemplar.due_on.to_s).to eq(hash['due_on'])
Run Code Online (Sandbox Code Playgroud)

或者:

expect(exemplar.due_on).to eq(Date.parse(hash['due_on']))
Run Code Online (Sandbox Code Playgroud)

或使用Active Support 核心扩展

expect(exemplar.due_on).to eq(hash['due_on'].to_date)
Run Code Online (Sandbox Code Playgroud)