Rspec等于方法
根据我的理解,equal方法检查对象是否相同。
person = Person.create!(:name => "David") Person.find_by_name("David").should equal(person)
这应该是真的。
但这里有两个不同的对象吗?
两个物体怎么可能一样? 我不明白。
如果参考equal
检查相等。 它对应于Object#equal?
方法。 您想使用==
来比较这些对象。
Rails和RSpec相等测试有多种选择。
Rails 3.2 ActiveRecord :: Base使用==
等于匹配器。
它以两种不同的方式返回:
- 如果
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
在您的示例中,您正在创建记录然后找到它。
所以你有两个选择来测试#find_by_name
:
-
要测试它是否检索完全相同的对象或具有相同ID的等效Person记录,那么使用
should ==
或其等效的a.should eql
或其DSL版本should eq
-
要测试它是否使用完全相同的对象而不是具有相同ID的等效Person记录,那么use
should equal
或者它的DSL版本should be