Некорректное поведение NUnit Assert.AreNotEqual при работе с IEnumerable <T>? - PullRequest
5 голосов
/ 01 февраля 2012

При использовании 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, он просто сравнивает эти две коллекции и игнорирует любые другие свойства объектов.

Мне это кажется неправильным: тот факт, что объект реализует определенный интерфейс, не ограничивает его только выполнением этой роли. Или интерфейс IEnumerable в .NET является особым случаем? Или я просто неправильно понял NUnit?

1 Ответ

3 голосов
/ 01 февраля 2012

Похоже, что это ошибка в NUnit, насколько я понимаю, она будет исправлена ​​в версии 3.0. Ниже приведено обсуждение возможной работы по реализации IComparer<T>:

...