Rspec等于方法

nev*_*ame 19 ruby rspec

根据我的理解,equal方法检查对象是否相同.

person = Person.create!(:name => "David")
Person.find_by_name("David").should equal(person)
Run Code Online (Sandbox Code Playgroud)

这应该是真的.

但这里有两个不同的对象吗?

两个物体怎么可能一样?我不明白.

joe*_*son 37

Rails和RSpec相等测试有多种选择.

Rails 3.2 ActiveRecord :: Base使用==相等匹配器.

它以两种不同的方式返回:

  • If self与比较对象是完全相同的对象
  • If self与比较对象的类型相同,并且具有相同的ID

请注意,ActiveRecord :: Base的==方法为别名eql?.这比典型的Ruby对象,其定义不同的==eql?不同.

RSpec 2.0在rspec期望中具有这些相等匹配器:

a.should equal(b) # passes if a.equal?(b)
a.should eql(b) # passes if a.eql?(b)
a.should == b # passes if a == b
Run Code Online (Sandbox Code Playgroud)

RSpec还有两个相等匹配器,旨在为他们提供更多的DSL感觉:

a.should be(b) # passes if a.equal?(b)
a.should eq(b) # passes if a == b
Run Code Online (Sandbox Code Playgroud)

在您的示例中,您正在创建记录然后找到它.

所以你有两个测试选择#find_by_name:

  • 要测试它是否检索完全相同的对象具有相同ID的等效Person记录,请使用should ==或等效a.should eql或其DSL版本should eq

  • 要测试它是否使用完全相同的对象而不是具有相同ID的等效Person记录,请使用should equal或其DSL版本should be


Mar*_*une 14

equal检查引用是否相同.它对应于该Object#equal?方法.您想用来==比较这些对象.