19

ルビーでまったく同じ属性と値を持つ 2 つの異なるオブジェクトを作成しました。

両方のオブジェクトの内容は同じですが、次の比較を比較したいと思います。

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

失敗します:

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

rspec/ruby でこれを簡単に達成する方法はありますか?

乾杯!!

4

4 に答える 4

14

#==これを行う慣用的な方法は、演算子をオーバーライドすることです。

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

  def hash
    primary_key.hash
  end
end

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

編集:この特定のケースでできるもう1つのことは、オーバーライドを含まず、カスタム RSpec matcher#==を作成することです。

于 2012-12-16T05:20:21.887 に答える
9

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 ドキュメント

于 2016-08-28T18:23:35.520 に答える
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
于 2015-04-22T09:53:05.477 に答える
0

おそらく、オブジェクトで equal 演算子をオーバーロードすることを検討する必要があります。

于 2012-12-16T05:19:43.747 に答える