2010-08-08 15 views
19

जो मैंने समझा है, वही विधि जांचता है कि ऑब्जेक्ट समान है या नहीं।रुपयेपेक बराबर विधि

person = Person.create!(:name => "David") 
Person.find_by_name("David").should equal(person) 

यह सच होना चाहिए।

लेकिन क्या यहां दो अलग-अलग वस्तुएं नहीं हैं?

दो वस्तुएं समान कैसे हो सकती हैं? मुझे यह समझ में नहीं आता है।

+0

कौन से दो अलग-अलग वस्तुओं आप की बात कर रहे हैं? – jtbandes

+0

@jtbandes: पहली पंक्ति में एक ऑब्जेक्ट लौटाया जाता है जिसे "व्यक्ति" का संदर्भ दिया जाएगा। दूसरी पंक्ति में एक वस्तु को वापस कर दिया जाता है और यह वस्तु व्यक्ति के बराबर होनी चाहिए। तो क्या दो वस्तुएं नहीं हैं? –

+0

या तो ए) सटीक उसी वस्तु को वापस किया जा सकता है; या बी) दूसरी वस्तु बराबर हो सकती है (अपने स्वयं के 'बराबर?' या अन्य विधि से) पहले, समान गुण रखने की तरह (इस मामले में, 'नाम')।ActiveRecord :: बेस दस्तावेज़ पढ़ें। – jtbandes

उत्तर

14

equal जांच करता है कि संदर्भ समान है या नहीं। यह Object#equal? विधि से मेल खाता है। आप इन वस्तुओं की तुलना करने के लिए == का उपयोग करना चाहते हैं।

37

रेल और आरएसपीसी समानता परीक्षणों में कई प्रकार के विकल्प हैं।

रेल 3.2 ActiveRecord :: बेस == समानता matcher का उपयोग करता है।

यह रिटर्न सच दो अलग अलग तरीकों:

  • तो self तुलना वस्तु
  • तो self तुलना वस्तु के रूप में एक ही प्रकार है और आईडी समान होता है के रूप में एक ही सटीक वस्तु है

ध्यान दें कि ActiveRecord :: बेस में == विधि है जो eql? के रूप में उपनाम है। यह सामान्य रूबी ऑब्जेक्ट्स से अलग है, जो == और eql? को अलग-अलग परिभाषित करता है।

a.should equal(b) # passes if a.equal?(b) 
a.should eql(b) # passes if a.eql?(b) 
a.should == b # passes if a == b 

RSpec भी एक डीएसएल के और अधिक के लिए उन्हें लग रहा है इरादा दो समानता matchers है:

RSpec 2.0 rspec-उम्मीदों में इन समानता matchers है

a.should be(b) # passes if a.equal?(b) 
a.should eq(b) # passes if a == b 

अपने उदाहरण में आप फिर इसे खोजने के बाद एक रिकॉर्ड बना रहे हैं। अगर यह ठीक उसी वस्तु या एक ही आईडी से एक बराबर व्यक्ति रिकॉर्ड को पुन: प्राप्त

  • परीक्षण करने के लिए, तो should == का उपयोग या इसके समकक्ष a.should eql या उसके:

    तो तुम परीक्षण #find_by_name के लिए दो विकल्प हैं अगर यह ठीक उसी वस्तु का उपयोग करता डीएसएल संस्करण should eq

  • परीक्षण करने के लिए नहीं एक ही आईडी से एक बराबर व्यक्ति रिकॉर्ड, तो ०१२३५३६०५४११ का उपयोगया उसके डीएसएल संस्करण should be

+1

'==' और 'eql' समकक्ष नहीं हैं:' 2 == 2.0 और 2.eql नहीं? 2.0' – aaronsw

+0

धन्यवाद हारून, अच्छा बिंदु। मैं यह स्पष्ट करने के लिए उत्तर अपडेट कर रहा हूं कि ActiveRecord :: बेस उन्हें समकक्ष बनाता है, जो रूबी के सामान्य उपयोग से अलग है। – joelparkerhenderson

+0

धन्यवाद @joelparkerhenderson। यह मैंने देखा रूबी समानता का सबसे उपयोगी अवलोकन है। –

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