Ruby/Rspec:可以比较两个对象的内容吗?

mic*_*ael 12 ruby rspec

我在ruby中创建了2个不同的对象,具有完全相同的属性和值.

我现在要比较两个对象的内容是否相同,但以下比较:

actual.should == expected
actual.should eq(expected)
actual.should (be expected)
Run Code Online (Sandbox Code Playgroud)

失败了:

  Diff:
  @@ -1,4 +1,4 @@
  -#<Station:0x2807628
  +#<Station:0x2807610
Run Code Online (Sandbox Code Playgroud)

在rspec/ruby​​中有什么方法可以轻松实现这一点吗?

干杯!!

Eri*_*ker 11

这样做的惯用方法是覆盖#==运算符:

class Station
  def ==(o)
    primary_key == o.primary_key
  end

  def hash
    primary_key.hash
  end
end
Run Code Online (Sandbox Code Playgroud)

执行此操作时,通常也要覆盖该#hash方法.覆盖#eql?或不太常见#equal?.

编辑:在这个特定情况下,你可以做的另一件事,不涉及覆盖#==,是制作自定义RSpec匹配器.


JE4*_*E42 8

使用 have_attributes 匹配器指定对象的属性与预期属性匹配:

  Person = Struct.new(:name, :age)
  person = Person.new("Jim", 32)

  expect(person).to have_attributes(:name => "Jim", :age => 32)
  expect(person).to have_attributes(:name => a_string_starting_with("J"), :age => (a_value > 30) )
Run Code Online (Sandbox Code Playgroud)

Relishapp RSpec 文档


小智 5

有点晚了,但您可以将其序列化,例如:

require 'json'

expect(actual.to_json).to eq(expected.to_json) #new rspec syntax
actual.to_json.should eq(expected.to_json) #old rspec syntax
Run Code Online (Sandbox Code Playgroud)


Arc*_*rus 0

也许您应该考虑重载对象上的等于运算符。