Ruby Rspec等值法
据我所知,equal方法检查对象是否相同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
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
- 如果
与比较对象的类型相同且具有相同的IDself
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==
或其DSL版本a.should eql
should eq
- 要测试它是否使用了完全相同的对象而不是具有相同ID的等效个人记录,请使用
或其DSL版本应等于
应为
equal?
或其他方法),就像具有相同的属性一样(在本例中,name
)。阅读ActiveRecord::基本文档。==
和eql
不是等价的:2==2.0而不是2.eql?2.0
谢谢Aaron,说得好。我正在更新答案,以澄清ActiveRecord::Base确实使它们等效,这与Ruby的典型用法不同。谢谢@joelparkerhenderson。这是我见过的最有用的Ruby平等概述。