2012-02-01 13 views
5

Usando NUnit 2.5.9, la siguiente prueba falla inesperada:Comportamiento incorrecto de NUnit Assert.AreNotEqual cuando se trata de 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); 
    } 
} 

Excavando en el código NUnit, resulta que cuando se encuentra con NUnit dos objetos que implementan IEnumerable, simplemente compara las dos colecciones e ignora cualquier otra propiedades en los objetos.

Esto me parece incorrecto: el hecho de que un objeto implemente una interfaz particular no lo limita a realizar solo esa función. ¿O es la interfaz IEnumerable en .NET un caso especial? ¿O acabo de malinterpretar a NUnit?

+0

+1 Interesante pregunta – sll

Respuesta

3

Parece que esto es un error en NUnit, por lo que entiendo, se solucionará en la versión 3.0. A continuación un breve debate con un posible trabajo en torno a la implementación de IComparer<T>:

+0

Gracias por la información. Voy a solucionarlo utilizando 'Assert.IsTrue (first! = Second)' por el momento – Akash

+0

@Akash: pero esto tampoco verificará proeprties, considere también verificar 'first.Bar! = Second.Bar' – sll

+1

@sll: ¿Por qué no? La clase de OP tiene una implementación '! =' Que llama a 'Equals', que luego verifica la propiedad' Bar' así como también los elementos de la colección. – LukeH

Cuestiones relacionadas