2010-08-08 12 views
19

Según lo que he entendido, el método igual comprueba si el objeto es el mismo.Método igual Rspec

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 dos objetos ser el mismo? No entiendo eso.

+0

¿A qué dos objetos diferentes hace referencia? – jtbandes

+0

@jtbandes: en la primera línea se devuelve un objeto al que se hará referencia a "persona". en la segunda línea se devuelve un objeto y este objeto debe ser igual a la persona. Entonces, ¿no son esos dos objetos? –

+0

O bien a) el mismo objeto exacto podría ser devuelto; o b) el segundo objeto podría ser igual (por su propio 'igual?' u otro método) al primero, como tener las mismas propiedades (en este caso, 'nombre').Lea los documentos ActiveRecord :: Base. – jtbandes

Respuesta

14

equal comprueba si la referencia es la misma. Corresponde al método Object#equal?. Desea utilizar == para comparar estos objetos.

37

Los rieles y las pruebas de igualdad RSpec tienen una variedad de opciones.

Rails 3.2 ActiveRecord :: Base utiliza el igualador de igualdad ==.

devuelve true dos maneras diferentes:

  • Si self es el mismo objeto exacto como el objeto de comparación
  • Si self es el mismo tipo que el objeto de comparación y tiene el mismo ID

Tenga en cuenta que ActiveRecord :: Base tiene el método == que tiene un alias como eql?. Esto es diferente a los objetos típicos de Ruby, que definen == y eql? de manera diferente.

RSpec 2.0 tiene estos comparadores 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 comparadores igualdad destinados a tener más de un DSL sentir a ellos:

a.should be(b) # passes if a.equal?(b) 
a.should eq(b) # passes if a == b 

En su ejemplo se Estamos creando un registro y luego lo encontramos.

lo que tiene dos opciones para las pruebas #find_by_name:

  • Para probar si se recupera el mismo objeto exacto O un registro de persona equivalente con el mismo ID, a continuación, utilizar should == o su equivalente a.should eql o su versión DSL should eq

  • Para probar si se utiliza el mismo objeto exacto NO un registro equivalente persona con el mismo ID, a continuación, utilizar should equal o su versión DSL should be

+1

'==' y 'eql' no son equivalentes:' 2 == 2.0 y no 2.eql? 2.0' – aaronsw

+0

Gracias Aaron, buen punto. Estoy actualizando la respuesta para aclarar que ActiveRecord :: Base los hace equivalentes, que es diferente al uso típico de Ruby. – joelparkerhenderson

+0

Gracias @joelparkerhenderson. Esta es la descripción más útil de la igualdad de Ruby que he visto. –

Cuestiones relacionadas