2012-02-01 24 views
5

Sử dụng NUnit 2.5.9, kiểm tra sau bất ngờ thất bại:Hành vi sai của NUnit Assert.AreNotEqual khi giao dịch với 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); 
    } 
} 

Đào vào mã NUnit, nó chỉ ra rằng khi NUnit gặp hai đối tượng thực hiện IEnumerable, nó chỉ so sánh hai bộ sưu tập và bỏ qua bất kỳ khác các thuộc tính trên các đối tượng.

Điều này cảm thấy sai với tôi: thực tế là một đối tượng thực hiện một giao diện cụ thể không giới hạn nó để chỉ thực hiện vai trò đó. Hoặc là giao diện IEnumerable trong .NET một trường hợp đặc biệt? Hay tôi chỉ hiểu lầm NUnit?

+0

+1 Thú vị câu hỏi – sll

Trả lời

3

Có vẻ như đây là lỗi trong NUnit, theo như tôi hiểu nó sẽ được sửa trong phiên bản 3.0. Dưới đây một số cuộc thảo luận với một tác phẩm có thể xung quanh việc thực hiện IComparer<T>:

+0

Cảm ơn thông tin. Tôi sẽ làm việc xung quanh nó bằng cách sử dụng 'Assert.IsTrue (đầu tiên! = Giây)' trong thời gian là – Akash

+0

@Akash: nhưng điều này sẽ không kiểm tra proeprties là tốt, xem xét cũng kiểm tra 'first.Bar! = Second.Bar' – sll

+1

@ sll: Tại sao không? Lớp của OP có một '! =' Thực hiện gọi 'Equals', sau đó kiểm tra thuộc tính' Bar' cũng như các phần tử của bộ sưu tập. – LukeH

Các vấn đề liên quan