2012-08-06 14 views
13

निम्नलिखित 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

यह एक रेल विधि –

+0

@ जॉन गहरे लाल रंग नहीं है प्रतीक कुंजी के साथ हैश पर with_indifferent_access का उपयोग सुनिश्चित करें नीचे hashrocket रूबी वाक्य रचना और Rspec उम्मीद वाक्य रचना के साथ एक उदाहरण है .s.in.co: हाँ, लेकिन अब ActiveSupport का उपयोग स्टैंड-अलोन (इसके छोटे सबसेट लोड करने की क्षमता के साथ) किया जा सकता है, यह एक स्वीकार्य उत्तर है। –

0

सबसे आसान तरीका यह लिखने के लिए इतना है कि यह बात से मेल होता होगा आप हो रहा है, अगर आपको स्ट्रिंग मिलती है, या यदि आपको प्रतीक मिलते हैं तो प्रतीकों को डालने की तरह।

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

मान लिया जाये कि आप Rails's ActiveSupport की पहुंच है

आप ऐसा नहीं कर सकते हैं, तो मैं क्या करता हूँ की तरह कुछ होगा। आप दोनों हैंश से मेल खाने के लिए with_indifferent_access का लाभ उठा सकते हैं।

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 

नोट::

संबंधित मुद्दे