NUnit Assert.Equals Что мне не хватает?

Assert.Equals() никогда не вызывает

Equals()
operator ==
operator !=

Я что-то упустил? Я реализовал IEquatable, но все же методы никогда не вызываются при использовании nunit.

if (objectA != objectB) Assert.Fail(); //doesnt fail
if (!objectA.Equals(objectB)) Assert.Fail(); //doesnt fail
Assert.AreEqual(objectA, objectB); //fail

UPDATE

Я должен был быть более ясным.

public class Entity 
{
  public int ID { get; set; }
}

var objectA = new Entity() { ID = 1 };
var objectB = new Entity() { ID = 1 };

два отдельных экземпляра с одинаковым идентификатором. Я применил все соответствующие методы, чтобы сделать эту работу для ==,!= и Equals, но nunit AreSame и AreEqual все еще не могут вызвать эти методы.

Ответ 1

Вы определенно правы. Я сегодня боролся с аналогичной проблемой, пока не нашел ваш пост, и теперь я уверен, что NUnit IsEqualTo() не всегда вызывает переопределенные значения Equals.

Я говорю последовательно, потому что иногда это происходит. На самом деле у меня есть два класса. Второй - первый. Когда я вызываю Is.EqualTo() в экземплярах первого, NUnit вызывает переопределения Equals, для экземпляров второго - нет.

Хотя это очень странно, у меня нет времени для дальнейшего изучения того, что происходит.

Люди с подобными проблемами или решениями обязательно должны сообщать об этом, так как это очень раздражает, и на самом деле я сомневался в правильности моих тестов.

Тем временем я создал следующий класс Affirm, который вызывает переопределения Equals (я проверил его). Он использует NUnit для выполнения простого равенства Assert вместо Is.EqualTo() и в некоторой степени устраняет тот факт, что таким образом NUnit не дает строковых представлений объектов в случае неудачи теста.

Итак, вот оно:

using NUnit.Framework;

public static class Affirm
{
    public static Affirmer That(object actual)
    {
        return new Affirmer(actual);
    }
}

[EditorBrowsable(EditorBrowsableState.Never)]
public class Affirmer
{
    readonly object _actual;

    public Affirmer(object actual)
    {
        _actual = actual;
    }

    public void IsEqualTo(object expected)
    {
        string failureMessage = string.Format("\nExpected: <{0}>\nBut was:  <{1}>", _actual, expected);
        Assert.That(_actual.Equals(expected), Is.True, failureMessage);
    }

    public void IsNotEqualTo(object expected)
    {
        string failureMessage = string.Format("\nDid not excpect: <{0}>\nBut was:         <{1}>", _actual, expected);
        Assert.That(_actual.Equals(expected), Is.False, failureMessage);
    }
}

Используйте его следующим образом:

Affirm.That(actualObject).IsEqualTo(expectedObject);

и

Affirm.That(actualObject).IsNotEqualTo(expectedObject);

Надеюсь, что это поможет.

Ответ 3

Некоторые фреймворки допускают, что равенство работает по-разному до назначения Идентификатора (т.е. Сущность несохранена), чем afterwarsd, когда ясно, что целью является то, что Идентификатор Entity является единственной основой для качества. Используете ли вы какую-то фреймворк или являетесь ли Entity вашим собственным классом?

Если это ваш собственный класс, вы можете показать суть вашей логики Equals()?

Cheers, Berryl

FYI Assert.AreSame НИКОГДА не проверяет вашу реализацию IEquatable! См. ReferenceEquals в вашем справочном документе, чтобы лучше понять это утверждение.

Ответ 4

Он должен работать (см. этот связанный вопрос), если метод Equals был правильно переопределен. Может быть, это проблема с вашим методом Equals (хотя, если он просто состоит из сравнения int, я бы не подумал)? Возможно, стоит установить точку останова в вашем методе Equals и затем запустить тест, чтобы увидеть, что происходит за кулисами.