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
selfes el mismo objeto exacto que el objeto de comparación - Si
selfes 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 eqlo su versión DSLshould eqPara probar si usa exactamente el mismo objeto NO un registro de persona equivalente con la misma ID, entonces el uso
should equalo 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.