ruby - spectroscopy - rspec subject
Rspec igual método (2)
Por lo que he entendido, el método igual verifica si el objeto es el mismo.
person = Person.create!(:name => "David")
Person.find_by_name("David").should equal(person)
Esto debería ser cierto.
Pero ¿no hay dos objetos diferentes aquí?
¿Cómo podrían ser dos objetos iguales? No entiendo eso
Las pruebas de igualdad de Rails y RSpec tienen una variedad de opciones.
Rails 3.2 ActiveRecord :: Base utiliza el ==
igualador de igualdad.
Devuelve verdad de dos maneras diferentes:
- Si
self
es el mismo objeto exacto que el objeto de comparación - Si
self
es del mismo tipo que el objeto de comparación y tiene la misma ID
Tenga en cuenta que ActiveRecord :: Base tiene el método ==
que tiene un alias como eql?
. Esto es diferente de los objetos típicos de Ruby, que definen ==
y eql?
diferentemente.
RSpec 2.0 tiene estos igualadores de igualdad en rspec-expectativas:
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 también tiene dos emparejadores de igualdad destinados a tener una sensación más DSL:
a.should be(b) # passes if a.equal?(b)
a.should eq(b) # passes if a == b
En tu ejemplo, estás creando un registro y luego encontrándolo.
Así que tienes dos opciones para probar #find_by_name
:
Para probar si recupera el mismo objeto exacto O un registro de persona equivalente con el mismo ID, entonces
should ==
usarshould ==
o su equivalentea.should eql
o su versión DSLshould eq
Para probar si usa exactamente el mismo objeto NO un registro de persona equivalente con la misma ID, entonces el uso
should equal
o su versión DSLshould be
cheques equal
si la referencia es la misma. ¿Corresponde al Object#equal?
método. Quieres usar ==
para comparar estos objetos.