Ruby Rspec等值法

Ruby Rspec等值法,ruby,rspec,Ruby,Rspec,据我所知,equal方法检查对象是否相同 person = Person.create!(:name => "David") Person.find_by_name("David").should equal(person) 这应该是真的 但是这里不是有两个不同的物体吗 两个物体怎么可能是一样的?我不明白。equal检查引用是否相同。它对应于Object#equal?方法。您需要使用==来比较这些对象。Rails和RSpec相等性测试有多种选择 Rails 3.2 ActiveRecor

据我所知,equal方法检查对象是否相同

person = Person.create!(:name => "David")
Person.find_by_name("David").should equal(person)
这应该是真的

但是这里不是有两个不同的物体吗


两个物体怎么可能是一样的?我不明白。

equal
检查引用是否相同。它对应于
Object#equal?
方法。您需要使用
==
来比较这些对象。

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

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

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

  • 如果
    self
    是与比较对象完全相同的对象
  • 如果
    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
RSpec还有两个平等匹配器,旨在给他们带来更多的DSL体验:

a.should be(b) # passes if a.equal?(b)
a.should eq(b) # passes if a == b
在您的示例中,您正在创建一个记录,然后找到它

因此,您有两种选择来测试
#按名称查找

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

  • 要测试它是否使用了完全相同的对象而不是具有相同ID的等效个人记录,请使用
    应等于
    或其DSL版本
    应为


您指的是哪两个不同的对象?@jtbandes:在第一行中,返回一个对象,该对象将指哪个“人”。在第二行中,返回一个对象,该对象应等于person。那么这不是两个对象吗?或者a)可以返回完全相同的对象;或者b)第二个对象可以与第一个对象相等(通过它自己的
equal?
或其他方法),就像具有相同的属性一样(在本例中,
name
)。阅读ActiveRecord::基本文档。
==
eql
不是等价的:
2==2.0而不是2.eql?2.0
谢谢Aaron,说得好。我正在更新答案,以澄清ActiveRecord::Base确实使它们等效,这与Ruby的典型用法不同。谢谢@joelparkerhenderson。这是我见过的最有用的Ruby平等概述。