Nota per i futuri lettori: pensa che RSpec non consideri i tuoi Hash uguali? Uno potrebbe essere un OrderedHash, ma dal normale output di RSpec non si può dire. Questo è stato il problema che ha spinto questo post.Esiste un correttore RSpec2 per la corrispondenza degli hash?
domanda originale:
Supponiamo che io abbia una specifica dove voglio provare che un metodo genera l'hash appropriata.
it 'should generate the Hash correctly' do
expected = {:foo => 1, 'baz' => 2}
subject.some_method_that_should_generate_the_hash.should == expected
end
Questo spesso fallisce, poiché diversi hash con le stesse coppie di valori-chiave possono restituire loro coppie in un diverso ordine. Risultati assomigliano:
Failure/Error: subject.some_method_that_should_generate_the_hash.should == expected
expected: {:foo => 1, 'baz' => 2},
got: {'baz' => 2, :foo => 1}
Per gli array, questo è risolto utilizzando l'operatore = ~. Tuttavia, questo non funziona per Hash. Per ora, ho fatto ricorso a
it 'should generate the Hash correctly' do
expected = {:foo => 1, 'baz' => 2}
subject.some_method_that_should_generate_the_hash.each {|k,v|
v.should == expected[k]
}
end
ma sembra inutilmente prolisso. Mi aspetto che ci sia una soluzione ovvia per questo. Sto trascurando qualcosa nei documenti o RSpec non ha un Corrispondente adatto per l'uguaglianza di Hash senza ordine?
Ieri ritardo ho trovato il problema: non stavo effettivamente confrontando due Hash: uno si era trasformato in un OrderedHash da qualche parte lungo la strada. Non puoi guardarlo dall'uscita RSpec e sono un po 'imbarazzato nel dire che non era la prima volta che cadevo in questa trappola:/ – Confusion
Interessante. Quindi un OrderedHash e un Hash con le stesse coppie chiave/valore non sono considerati uguali: è bello saperlo. – zetetic