2012-02-01 3 views
5

は、以下のテストが予期せず失敗します。IEnumerable <T>を扱う場合、NUnit Assert.AreNotEqualの動作が正しくありませんか? NUnitの2.5.9使用

[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を実装する2つのオブジェクトに遭遇した場合、それだけで2つのコレクションを比較し、他を無視することが判明しますオブジェクトのプロパティ。

これは私にとって間違っています。オブジェクトが特定のインターフェイスを実装していても、その役割を果たすだけに限定されるわけではありません。または、.NETのIEnumerableインターフェイスが特別なケースですか?または私はちょうどNUnitを誤解している?

+0

+1興味深い質問の情報のため – sll

答えて

3

これはNUnitのバグです。私が理解している限り、3.0バージョンで修正されるはずです。 IComparer<T>を実装周りに可能な作業でいくつかの議論下:

+0

感謝。 – Akash

+0

@Akashについては、 'Assert.IsTrue(first!= second)'を使用して回避します:しかし、これもproeptrtiesをチェックするのではなく、 'first.Bar!= second.Bar'を確認することを検討してください。 – sll

+1

@sll:どうしてですか? OPのクラスには '!='という実装があり、 'Equals'が呼び出され、' Bar'プロパティとコレクションの要素がチェックされます。 – LukeH

関連する問題