2012-08-06 60 views
13

考慮以下RSpec的片段:RSpec:將帶有符號鍵的散列與帶有字符串鍵的散列進行比較?

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

因爲一個哈希使用符號鍵和其它使用字符串鍵此測試失敗。就我而言,一個散列是一個解析的JSON對象,另一個是創建該對象的散列。我希望他們比較平等。

在我編寫我自己的匹配器或強制兩個哈希都具有字符串鍵之前,有沒有一種匹配器或技術來處理這種(常見)的情況?

回答

15

你可以這樣做:

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

這是一個軌道的方法不是紅寶石 – 2015-07-30 22:13:54

+0

@約翰.sin.co:是的,但現在ActiveSupport可以獨立使用(能夠加載它的小部分),這是一個可以接受的答案。 – 2016-06-03 05:34:49

0

最簡單的方法是寫它,這樣它會符合你的事如果你得到了字符串,就像放置字符串,或者如果你拿到符號,就把符號放進去。

如果你不能做到這一點,我會做會是這樣的:

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

假設你有機會獲得Rails's ActiveSupport。 您可以利用with_indifferent_access來匹配兩個散列。 下面是與hashrocket Ruby的語法和Rspec的期望語法的例子:

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 

注:確保對哈希使用with_indifferent_access與符號鍵