Trong Ruby 1.9.2
trên Rails 3.0.3
, Tôi đang cố gắng kiểm tra sự bình đẳng đối tượng giữa hai đối tượng Friend
(lớp kế thừa từ ActiveRecord::Base
).Cách kiểm tra đối tượng (đối tượng ActiveRecord)
Đối tượng đều bình đẳng, nhưng các thử nghiệm thất bại:
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?)
Chỉ cần cho những nụ cười, tôi cũng kiểm tra nhận dạng đối tượng, mà không như tôi mong đợi:
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.
Ai đó có thể giải thích với tôi tại sao thử nghiệm đầu tiên cho sự bình đẳng đối tượng thất bại, và làm thế nào tôi có thể khẳng định thành công hai đối tượng đó bằng nhau?
Nhưng trong trường hợp này, cột nhận dạng là 'nil' cho cả hai trường hợp vì không có con ong n đã lưu. 'eql?()' kiểm tra cả giá trị và kiểu thuộc tính. 'nil.class == nil.class' là' true' và 'nil == nil' là' true', vì vậy ví dụ đầu tiên của OP vẫn phải là true. Câu trả lời của bạn không giải thích tại sao nó trả về sai. – Jazz
Nó không chỉ so sánh một cách mù quáng các id, nó chỉ so sánh các id nếu các id có ý nghĩa. Như đã đề cập trong câu trả lời của Andy Lindeman: "Các hồ sơ mới khác với bất kỳ hồ sơ nào khác theo định nghĩa". – Lambart