正規表現 - 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) )
私は全く同じ属性と値を持つ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