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?
+1 Thú vị câu hỏi – sll