正規表現 - Ruby/Rspec:2つのオブジェクトの内容を比較することは可能ですか?




ruby rspec 使い方 (3)

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) )

Relishapp RSpecドキュメント

私は全く同じ属性と値を持つ2つの異なるオブジェクトをrubyで作成しました。

両方のオブジェクトの内容は同じですが、次のように比較してみましょう。

actual.should == expected
actual.should eq(expected)
actual.should (be expected)

失敗します:

  Diff:
  @@ -1,4 +1,4 @@
  -#<Station:0x2807628
  +#<Station:0x2807610

rspec / ruby​​にこれを簡単に実現する方法はありますか?

乾杯!!


これを行う慣用的な方法は、 #==演算子を上書きすることです。

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

  def hash
    primary_key.hash
  end
end

これを行うときは、通常#hashメソッドもオーバーライドする必要があります。 #eql?をオーバーライドすることはあまり一般的ではあり#eql? または#equal?

編集#==を上書きすることを含まないこの特別な場合にあなたがすることができるもう一つのことはカスタムRSpecマッチャーを作ることです。


少し遅くなりますが、例を挙げてシリアル化することができます。

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




rspec