这两个对象是相等的,但测试失败:
Failure/Error: Friend.new(name: 'Bob').should eql(Friend.new(name: 'Bob'))
expected #<Friend id: nil, event_id: nil, name: 'Bob', created_at: nil, updated_at: nil>
got #<Friend id: nil, event_id: nil, name: 'Bob', created_at: nil, updated_at: nil>
(compared using eql?)
仅仅为了好玩,我也测试了对象的身份(identity),结果失败了,这是我预料中的。
Failure/Error: Friend.new(name: 'Bob').should equal(Friend.new(name: 'Bob'))
expected #<Friend:2190028040> => #<Friend id: nil, event_id: nil, name: 'Bob', created_at: nil, updated_at: nil>
got #<Friend:2190195380> => #<Friend id: nil, event_id: nil, name: 'Bob', created_at: nil, updated_at: nil>
Compared using equal?, which compares object identity,
but expected and actual are not the same object. Use
'actual.should == expected' if you don't care about
object identity in this example.
有人能向我解释为什么第一个对象相等性测试失败,以及如何成功地断言这两个对象是相等的吗?
nil
。eql?()
检查属性的值和类型。nil.class == nil.class
为true
,nil == nil
也为true
,因此 OP 的第一个示例仍应该返回 true。你的答案没有解释为什么它返回 false。 - Jazz