2012-08-06 14 views
13

Considérese el siguiente fragmento RSpec:RSpec: ¿comparar un hash con las teclas de cadena frente a un hash con teclas de símbolos?

it "should match" do 
    {:a => 1, :b => 2}.should =~ {"a" => 1, "b" => 2} 
end 

Esta prueba falla debido a que uno de hash utiliza símbolos para las llaves y el otro utiliza cadenas de llaves. En mi caso, un hash es un objeto JSON analizado, el otro es el hash que creó el objeto. Me gustaría que se compararan como iguales.

Antes de escribir mi propio matcher o forzar ambos valores hash para tener claves de cadena, ¿hay un matcher o técnica que maneje este caso (común)?

Respuesta

15

Se podría hacer:

it "should match" do 
    {:a => 1, :b => 2}.stringify_keys.should =~ {"a" => 1, "b" => 2} 
end 
+0

Se trata de un método de rieles no Ruby –

+0

@ John .s.in.co: sí, pero ahora que ActiveSupport se puede usar de manera independiente (con la capacidad de cargar pequeños subconjuntos), esta es una respuesta aceptable. –

0

La forma más sencilla sería escribir de modo que había que coincida con lo que usted está obteniendo, como poner cadenas si obtiene cadenas, o poner símbolos si obtiene símbolos.

Si no puede hacer eso, lo que haría sería algo así como:

it "should match" do 
    {:a => 1}.with_indifferent_access.should =~ {'a' => 1}.with_indifferent_access 
end 
4

Asumiendo que tiene acceso a Rails's ActiveSupport. Puede aprovechar with_indifferent_access para que coincida con ambos valores hash. A continuación se muestra un ejemplo de la sintaxis de Ruby hashrocket y la Rspec esperan sintaxis:

it 'matches two hashes' do 
    hash_1 = {a: 1, b: 2}.with_indifferent_access 
    hash_2 = {'a' => 1, 'b' => 2} 
    expect(hash_1).to match(hash_2) 
end 

Nota: asegúrese de usar with_indifferent_access en el hash con las teclas de símbolos

Cuestiones relacionadas