2012-02-01 8 views
5

NUnit 2.5.9 का उपयोग करना, निम्नलिखित परीक्षण अप्रत्याशित रूप से विफल रहता है:एनयूनीट Assert.AreNotEqual का गलत व्यवहार IENumerable <T> से निपटने पर?

[TestFixture] 
public class FooTest 
{ 
    [Test] 
    public void Inequality() 
    { 
     var first = new Foo(new[] { 1 }, 2); 
     var second = new Foo(new[] { 1 }, 3); 

     Assert.AreNotEqual(first, second); 
    } 
} 

public struct Foo : IEnumerable<int>, IEquatable<Foo> 
{ 
    private readonly IEnumerable<int> values; 

    public int Bar { get; private set; } 

    public Foo(IEnumerable<int> values, int bar) 
     : this() 
    { 
     this.values = values; 
     Bar = bar; 
    } 

    public IEnumerator<int> GetEnumerator() 
    { 
     return values.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

    public bool Equals(Foo other) 
    { 
     return other.values.SequenceEqual(values) && other.Bar == Bar; 
    } 

    public override bool Equals(object obj) 
    { 
     if (ReferenceEquals(null, obj)) 
     { 
      return false; 
     } 
     if (obj.GetType() != typeof(Foo)) 
     { 
      return false; 
     } 
     return Equals((Foo)obj); 
    } 

    public override int GetHashCode() 
    { 
     unchecked 
     { 
      return ((values != null ? values.GetHashCode() : 0) * 397)^Bar; 
     } 
    } 

    public static bool operator ==(Foo left, Foo right) 
    { 
     return left.Equals(right); 
    } 

    public static bool operator !=(Foo left, Foo right) 
    { 
     return !left.Equals(right); 
    } 
} 

NUnit कोड में खुदाई, यह पता चला है कि जब NUnit दो वस्तुओं है कि IEnumerable लागू सामना करना पड़ता है, यह सिर्फ दो संग्रह तुलना करता है और किसी अन्य पर ध्यान नहीं देता वस्तुओं पर गुण।

यह मेरे लिए गलत लगता है: तथ्य यह है कि कोई ऑब्जेक्ट किसी विशेष इंटरफ़ेस को लागू करता है, यह केवल उस भूमिका को करने के लिए सीमित नहीं करता है। या .NET में IENumerable इंटरफ़ेस एक विशेष मामला है? या क्या मैंने सिर्फ नुनीत को गलत समझा है?

+0

+1 दिलचस्प सवाल – sll

उत्तर

3

ऐसा लगता है कि यह न्यूटिट में एक बग है, जहां तक ​​मुझे लगता है कि यह 3.0 संस्करण में तय किया जाएगा।

+0

जानकारी के लिए धन्यवाद IComparer<T> को लागू करने के चारों ओर एक संभव काम के साथ कुछ चर्चा के नीचे। मैं – Akash

+0

@Akash के समय 'Assert.IsTrue (first! = Second)' का उपयोग करके इसके आसपास काम करूंगा: लेकिन यह प्रोपर्टीज की जांच भी नहीं करेगा, 'पहले। बार! = सेकेंड। बार' – sll

+1

@ एसएल: क्यों नहीं? ओपी की कक्षा में '! =' कार्यान्वयन होता है जो 'समानता 'कहता है, जो तब' बार 'संपत्ति के साथ-साथ संग्रह के तत्वों की जांच करता है। – LukeH

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