19

我在 ruby​​ 中创建了 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?覆盖或不太常见#equal?

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

于 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

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

于 2012-12-16T05:19:43.747 回答