2012-08-06 9 views
13

Betrachten Sie den folgenden RSpec Schnipsel:RSpec: Vergleichen eines Hash mit String Keys gegen einen Hash mit Symbol Keys?

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

Dieser Test schlägt fehl, weil eine Hash-Symbole für Schlüssel verwendet und die anderen Saiten für Schlüssel verwendet. In meinem Fall ist ein Hash ein analysiertes JSON-Objekt, der andere ist der Hash, der das Objekt erstellt hat. Ich möchte sie als gleichwertig vergleichen.

Bevor ich schreibe meinen eigenen Matcher oder zwingt beide Hashes zu haben String-Schlüssel, gibt es einen Matcher oder Technik, die diesen (gemeinsamen) Fall behandelt?

Antwort

15

Sie tun können:

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

Methode –

+0

@John nicht rubin Dies ist ein Schienen verwenden .s.in.co: Ja, aber jetzt, wo ActiveSupport eigenständig verwendet werden kann (mit der Fähigkeit, kleine Teilmengen davon zu laden), ist dies eine akzeptable Antwort. –

0

Der einfachste Weg, es zu schreiben, wäre so, dass es die Sache übereinstimmen würden Sie werden, wie wenn man Strings setzt oder Symbole setzt, wenn man Symbole bekommt.

Wenn Sie das nicht tun können, was ich würde wäre so etwas wie:

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

Angenommen, Sie Zugriff auf Rails's ActiveSupport haben. Sie können with_indifferent_access nutzen, um beide Hashes abzustimmen. Unten ist ein Beispiel mit dem hashrocket Ruby-Syntax und der Rspec erwarten Syntax:

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 

Hinweis: Stellen Sie sicher, dass with_indifferent_access auf dem Hash mit den Symboltasten

Verwandte Themen