tests spectroscopy spec run rails how ruby rspec

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 == usar should == o su equivalente a.should eql o su versión DSL should 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 DSL should be


cheques equal si la referencia es la misma. ¿Corresponde al Object#equal? método. Quieres usar == para comparar estos objetos.