2009-07-06 13 views
10

Assert.Equals() कभी नहीं कहता हैNUnit Assert.Equals मुझे क्या याद आ रही है?

Equals() 
operator == 
operator != 

मैं कुछ याद आ रही है? मैंने IEquatable लागू किया है लेकिन अभी भी ननिट का उपयोग करते समय विधियों को कभी नहीं बुलाया जा रहा है।

if (objectA != objectB) Assert.Fail(); //doesnt fail 
if (!objectA.Equals(objectB)) Assert.Fail(); //doesnt fail 
Assert.AreEqual(objectA, objectB); //fail 

अद्यतन

मैं स्पष्ट किया जाना चाहिए था।

public class Entity 
{ 
    public int ID { get; set; } 
} 

var objectA = new Entity() { ID = 1 }; 
var objectB = new Entity() { ID = 1 }; 

दो अलग-अलग उदाहरणों दोनों एक ही आईडी से मैं सभी प्रासंगिक तरीकों को लागू किया है के लिए ==,! = यह काम करते हैं और बराबर लेकिन nunit AreSame और AreEqual अभी भी उन तरीकों कॉल करने के लिए विफल रहता है के लिए।

+1

मुझे बिल्कुल वही समस्या है। अभी के लिए मैं Assert.IsTrue (objectA.Equals (objectB)) का उपयोग कर रहा हूं; –

+0

मुझे एक ही समस्या है और मैंने यह निर्धारित किया है कि यह काम करता है यदि मैं जिन वस्तुओं की तुलना कर रहा हूं वे * समान * संदर्भ नहीं हैं। यानी गुणों की तुलना में समानता के अलावा विभिन्न गुणों के साथ 2 ऑब्जेक्ट्स बनाएं, फिर Assert.Equals काम करता है ... यदि यह वही संदर्भ तुलना किया जा रहा है (जो निश्चित रूप से बराबर हैं) तो यह विफल हो जाता है! जैसा कि बराबर नहीं है (NUnit 2.5) – PandaWood

+0

आप 'Assert.AreEqual (objA, objB) की तलाश में हैं; ' – DanielV

उत्तर

4

आप निश्चित रूप से सही हैं। मैं आज तक similar problem के साथ कुश्ती कर रहा था, जब तक कि मुझे आपकी पोस्ट नहीं मिली और अब मुझे यकीन है कि NUnit IsEqualTo() लगातार प्रदान किए गए बराबर ओवरराइड को कॉल नहीं करता है।

मैं लगातार कहता हूं, क्योंकि कभी-कभी ऐसा होता है। वास्तव में मेरे पास दो वर्ग हैं। दूसरा एक से लिया गया। जब मैं पहले के उदाहरणों पर Is.EqualTo() को कॉल करता हूं, तो एनयूनीट बराबर ओवरराइड कहता है, दूसरे के उदाहरणों के लिए यह नहीं करता है।

हालांकि यह बहुत ही असाधारण है, मेरे पास आगे बढ़ने की जांच करने का कोई समय नहीं है।

इसी तरह की समस्याओं या समाधान के साथ लोगों को निश्चित रूप से, इसके बारे में पोस्ट चाहिए, क्योंकि यह एक बहुत ही कष्टप्रद बात है और वास्तव में था मुझे मेरे परीक्षण की वैधता पर शक।

इस बीच मैंने निम्नलिखित एफ़र्म क्लास बनाया, जो बराबर के लिए बराबर ओवरराइड कहता है (मैंने इसे चेक किया है)। यह Is.EqualTo() के बजाय एक साधारण समानता आवेषण करने के लिए एनयूनीट का उपयोग करता है और कुछ हद तक इस तथ्य का उपचार करता है, इस तरह एनयूनीट परीक्षण विफल होने पर वस्तुओं के स्ट्रिंग प्रस्तुतियों को नहीं देता है।

तो यहाँ यह है:

using NUnit.Framework; 

public static class Affirm 
{ 
    public static Affirmer That(object actual) 
    { 
     return new Affirmer(actual); 
    } 
} 

[EditorBrowsable(EditorBrowsableState.Never)] 
public class Affirmer 
{ 
    readonly object _actual; 

    public Affirmer(object actual) 
    { 
     _actual = actual; 
    } 

    public void IsEqualTo(object expected) 
    { 
     string failureMessage = string.Format("\nExpected: <{0}>\nBut was: <{1}>", _actual, expected); 
     Assert.That(_actual.Equals(expected), Is.True, failureMessage); 
    } 

    public void IsNotEqualTo(object expected) 
    { 
     string failureMessage = string.Format("\nDid not excpect: <{0}>\nBut was:   <{1}>", _actual, expected); 
     Assert.That(_actual.Equals(expected), Is.False, failureMessage); 
    } 
} 

इस तरह यह प्रयोग करें:

Affirm.That(actualObject).IsEqualTo(expectedObject); 

और

Affirm.That(actualObject).IsNotEqualTo(expectedObject); 

आशा इस मदद करता है।

+0

बस पूर्णता के लिए: जैसा कि आपकी मूल पोस्ट में देखा जा सकता है (http://stackoverflow.com/questions/1624848/does-nunits-is-equalto-not-work-reliably-for-classes-derived-from-generic -classe), आपकी समस्या ऑब्जेक्ट के ओवरराइड में एक बग के कारण हुई थी। एक्सेल (ऑब्जेक्ट)। (मुझे लगता है कि इस धागे की ओपी की समस्या एक समान बग के कारण हुई थी।) –

+0

@ फ़ैबियनस्चमीड मुझे नहीं लगता कि यह बराबर विधि में बग के कारण है क्योंकि वह कहता है कि नूनिट कभी भी अपनी बराबर विधि को नहीं बुलाता है। मैं यहाँ एक ही समस्या के साथ आया हूँ। इससे कोई फर्क नहीं पड़ता कि मैं बराबर विधि में क्या बदलता हूं अगर इसे नुनिट – PandaWood

+0

द्वारा नहीं बुलाया जा रहा है, मुझे एक ही समस्या है लेकिन मेरे परीक्षण ने कक्षा में बराबर लागू करने से पहले काम किया था। कुछ ने एनयूनीट को * मेरी * समानता विधि को कॉल करने के लिए आश्वस्त नहीं किया होगा, अब मेरे पास एक है। मुझे नहीं लगता कि मैं कोड की जांच करने के लिए तैयार हूं, क्योंकि मैं इसे Assert.IsTrue (obj1.Equals (obj2)) का उपयोग कर काम करने के लिए प्राप्त कर सकता हूं। – PandaWood

8
मूल्य प्रकार के लिए संदर्भ प्रकार के लिए

उपयोग Assert.AreEqual(a, b), Assert.AreSame(a, b)http://www.nunit.org/index.php?p=identityAsserts&r=2.2.7

+0

यह अभी भी कहता है कि वे किसी कारण से समान नहीं हैं .. (यह मेरे बराबर तरीकों को कॉल नहीं करेगा) :( जो मैं परीक्षण करने की कोशिश कर रहा हूं वह उसी आईडी के साथ एक ही कक्षा के 2 उदाहरण हैं जो हां कहना चाहिए कि वे बराबर हैं। – bleevo

+0

सुनिश्चित नहीं है, आप निश्चित रूप से Assert.IsTrue (objectA == objectB) कर सकते हैं लेकिन मुझे यकीन नहीं है कि आप क्यों – Robert

+1

'Assert.AreSame (ए, बी)' वास्तव में 'संदर्भ एक्वाल्स (ए, बी)' कर रहा है, और हो सकता है कि आप जो भी खोज रहे हों, हो। यदि आप इस विधि का उपयोग करने के बजाय, उसी ऑब्जेक्ट उदाहरण पर जोर देना चाहते हैं अन्यथा, आप बेहतर तरीके से 'Assert.AreEqual (a, b)' का उपयोग कर सकते हैं। – Xilconic

3

कुछ ढांचे के बाद आईडीडी असाइन किए जाने से पहले समानता के लिए समानता के लिए काम करने की अनुमति देता है (यानी, इकाई असुरक्षित है), जब यह स्पष्ट होता है कि इरादा आईडी गुणवत्ता के लिए एकमात्र आधार है। क्या आप किसी प्रकार के ढांचे का उपयोग कर रहे हैं या इकाई अपनी खुद की कक्षा है?

यदि यह आपकी अपनी कक्षा है तो क्या आप अपने बराबर() तर्क का सारांश दिखा सकते हैं?

चीयर्स, Berryl

FYI करें Assert.AreSame कभी IEquatable के अपने कार्यान्वयन को मान्य करने के लिए एक परीक्षण है! उस सहायता को समझने के लिए अपने सहायता दस्तावेज़ में संदर्भ Equals देखें।

+0

+1 "Assert.AreSame के लिए +1 कभी भी IEquatable के कार्यान्वयन को सत्यापित करने के लिए एक परीक्षण नहीं है" –

1

यह काम करना चाहिए (इस related question देखें) यदि बराबर विधि सही ढंग से ओवरराइड की गई थी। क्या यह आपके बराबर विधि के साथ एक समस्या हो सकती है (हालांकि यदि यह केवल int तुलना में शामिल है तो मुझे नहीं लगता)? आपके बराबर विधि में ब्रेक पॉइंट सेट करने के लायक हो सकते हैं और फिर दृश्यों के पीछे क्या चल रहा है यह देखने के लिए परीक्षण चला सकते हैं।

+0

मुझे लगता है कि सेटिंग ब्रेकपॉइंट बिल्कुल ठीक था जो ओपी था आईएनजी – zcrar70

1

आप इस सवाल की जाँच करने के लिए चाहते हो सकता है: NUnit's Assert.Equals throws exception "Assert.Equals should not be used for assertions"

tl; डॉ; Assert.Equals(obj1, obj2) NUnit द्वारा ओवरराइड किया गया है, और अपवाद फेंकता है। आपको इसके बजाय Assert.AreEqual(obj1, obj2) का उपयोग करना चाहिए।

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