En Ruby 1.9.2
en Rails 3.0.3
, estoy intentando probar la igualdad de objetos entre dos objetos Friend
(clase hereda de ActiveRecord::Base
).Cómo probar la igualdad de objetos (ActiveRecord)
Los objetos son iguales, pero la prueba falla:
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?)
Sólo para las muecas, también pongo a prueba de la identidad del objeto, lo que falla como yo esperaría:
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.
Puede alguien explicar para mí, ¿por qué falla la primera prueba de igualdad de objetos y cómo puedo afirmar con éxito que esos dos objetos son iguales?
Pero en este caso la columna de identidad es 'las negativas para ambos casos porque ni tiene abeja n guardado 'eql?()' verifica tanto el valor como el tipo de un atributo. 'nil.class == nil.class' es' true' y 'nil == nil' es' true', por lo que el primer ejemplo de OP debería haber pasado verdadero. Tu respuesta no explica por qué está volviendo falso. – Jazz
No solo compara ids ciegamente, solo compara ids si los ids son significativos. Como se menciona en la respuesta de Andy Lindeman: "Los nuevos registros son diferentes de cualquier otro registro por definición". – Lambart