2012-08-06 14 views
13

Si consideri il seguente frammento di RSpec:RSpec: confronto di un hash con chiavi stringa contro un hash con i tasti simbolo?

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

Questo test non è riuscito perché una hash utilizza simboli per le chiavi e l'altro utilizza stringhe per le chiavi. Nel mio caso, un hash è un oggetto JSON analizzato, l'altro è l'hash che ha creato l'oggetto. Mi piacerebbe che fossero paragonabili.

Prima di andare a scrivere il mio matcher o forzare entrambi gli hash per avere chiavi di stringa, c'è un matcher o una tecnica che gestisce questo caso (comune)?

risposta

15

Si potrebbe fare:

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

Si tratta di un metodo di rotaie non rubino –

+0

@ John .s.in.co: sì, ma ora che ActiveSupport può essere utilizzato stand-alone (con la possibilità di caricare piccoli sottoinsiemi di esso), questa è una risposta accettabile. –

0

Il modo più semplice sarebbe quella di scrivere in modo che esso sarebbe la cosa che corrisponde stai ricevendo, come mettere le stringhe se ottieni delle stringhe o mettere dei simboli se ottieni dei simboli.

Se non è possibile farlo, quello che farei sarebbe qualcosa di simile:

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

Supponendo di avere accesso a Rails's ActiveSupport. È possibile utilizzare with_indifferent_access per far corrispondere entrambi gli hash. Di seguito è riportato un esempio con il hashrocket Rubino sintassi e la Rspec aspettano sintassi:

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: assicuratevi di usare with_indifferent_access sul hash con i tasti simbolo

Problemi correlati