2011-01-21 16 views
18

¿Hay una buena manera en Rspec para comparar dos objetos ActiveRecord mientras se ignora la identificación, & c? Por ejemplo, supongamos que estoy analizando un objeto desde XML y cargando el otro desde un dispositivo, y lo que estoy probando es que mi analizador XML funciona correctamente. Lo que tengo actualmente es un marcador personalizado conComparación de objetos ActiveRecord con Rspec

actual.attributes.reject{|key,v| %w"id updated_at created_at".include? key } == expected.attributes.reject{|key,v| %w"id updated_at created_at".include? key } 

Pero me pregunto si hay una manera mejor.

Y luego un poco más complicado, pero ¿hay alguna manera de hacer algo similar en un conjunto de ? Diga que dicho analizador XML también crea varios objetos que pertenecen al objeto original. Por lo tanto, el conjunto con el que estoy terminando debería ser idéntico, excepto ID, created_at, & c, y me pregunto si hay una buena forma de probarlo más allá del ciclismo, la eliminación de esas variables y la comprobación.

Respuesta

25

Una manera más corta de escribir lo anterior sería actual.attributes.except(:id, :updated_at, :created_at).

Si está utilizando mucho en esto, siempre se puede definir su propio coincidencias de la siguiente manera:

RSpec::Matchers.define :have_same_attributes_as do |expected| 
    match do |actual| 
    ignored = [:id, :updated_at, :created_at] 
    actual.attributes.except(*ignored) == expected.attributes.except(*ignored) 
    end 
end 

poner esto en su spec_helper.rb ahora se puede decir que en ningún ejemplo:

User.first.should have_same_attributes_as(User.last) 

Buena suerte.

+4

para mí solo funciona con comillas '[" id "," updated_at "," created_at "]' – zishe

+1

Para que funcione tanto con cadenas como con símbolos, puede usar HashWithIndifferentAccess: 'real.attributes.with_indifferent_access.except. ..'. – mrzasa

+1

Obtengo 'atributos' de método indefinido' cuando intento esto. ¿Qué puede estar mal? –

Cuestiones relacionadas