2012-08-06 13 views
13

Rozważmy następujący fragment: rspecRSpec: porównywanie hasha z kluczami łańcuchowymi z hashem z kluczami symboli?

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

Ten test nie powiedzie się, ponieważ jeden hash wykorzystuje symbole dla kluczy i innych zastosowań struny na klucze. W moim przypadku, jeden hasz to parsowany obiekt JSON, drugi to hasz, który utworzył obiekt. Chciałbym, żeby porównywali się jako równi.

Zanim przejdę do pisania własnego matchera lub wymuszam na skrótach klawisze ciągów znaków, czy istnieje przystawka lub technika obsługująca ten (wspólny) przypadek?

Odpowiedz

15

mógłby zrobić:

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

Jest to metoda szyny nie rubin –

+0

@john .s.in.co: tak, ale teraz, gdy ActiveSupport może być używany jako samodzielny (z możliwością załadowania jego małych podzbiorów), jest to akceptowalna odpowiedź. –

0

Najprościej byłoby napisać go tak, by był zgodny z rzeczą, którą Dostajesz, jak stawianie ciągów, jeśli dostajesz struny, lub umieszczasz symbole, jeśli otrzymujesz symbole.

Jeśli nie można tego zrobić, co bym zrobił, byłoby coś takiego:

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

zakładając, że masz dostęp do Rails's ActiveSupport. Możesz zastosować with_indifferent_access, aby dopasować oba skróty. Poniżej znajduje się przykład z hashrocket Ruby składni i rspec spodziewać składnia:

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 

Uwaga: Należy używać with_indifferent_access na hash z kluczami symboli

Powiązane problemy