2012-08-06 14 views
13

aşağıdaki RSpec parçasını inceleyin:RSpec: bir hashın tuşlarıyla sembol anahtarlı bir hash ile karşılaştırılması?

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

bir karma anahtarlar için semboller kullanır ve diğer tuşlar için dizeleri kullandığından, bu test başarısız olur. Benim durumumda, bir karma ayrıştırılmış bir JSON nesnesi, diğeri ise nesneyi oluşturan karmadır. Onları eşit olarak karşılaştırmak isterim.

Kendi eşleştiricimi yazmadan veya her iki karma anahtarın da dize anahtarlarına zorlamadan önce, bu (ortak) durumu ele alan bir eşleme veya teknik var mı?

cevap

15

:

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

Bu raylar yöntemi –

+0

@John sembol tuşlarıyla karma üzerinde with_indifferent_access kullandığınızdan emin yakut olmamasına dikkat edin Aşağıda hashrocket Yakut sözdizimi ve RSpec sözdizimi bekliyoruz ile bir örnektir .s.in.co: evet, fakat şimdi ActiveSupport'un bağımsız olarak kullanılabileceği (küçük altkümelerini yükleme yeteneği ile), bu kabul edilebilir bir cevaptır. –

0

basit yolu o şeyi eşleşecek ediyorum ki bunu yazmak olacaktır sen Dizeleri alırsan dizeleri koymak ya da semboller alırsan semboller koymak gibi. Sen yapabilirdi

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

Eğer Rails's ActiveSupport erişebilir varsayarsak bunu yapamıyorsan

, ne yaparım gibi bir şey olurdu. Her iki karma ile eşleştirmek için with_indifferent_access'dan yararlanabilirsiniz.

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 

Not:

İlgili konular