NUnit не работает хорошо с, Утверждают. AreEqual

Если можно добраться до журнала на экране, можно поразить Ctrl+Alt+F2 - это приносит Вам к терминалу, входят в систему подсказка. Войдите в систему со своим именем пользователя и паролем. Затем введите:

unity --reset

, Надо надеяться, это сбрасывает Ваш интерфейс правильно, и у Вас будут свои меню назад. К сожалению, это, вероятно, сбросит все Ваши настройки Compiz для установки по умолчанию. Однако у Вас должен быть свой интерфейс назад.

11
задан Peter Mortensen 27 December 2010 в 11:52
поделиться

3 ответа

Проблема в том, что вы скрываете Equals, а не переопределяете его. Отлично - ваш модульный тест обнаружил ошибку :)

Ваш код должен быть:

public override bool Equals(object obj)
{
    Money money = obj as Money;
    if (money == null)
        return false;

    return (amount == money.amount && currency == money.currency);
}

(Это предотвратит создание исключения, если вы укажете ему неправильный тип.)

Я сделал проверка на равенство строк тоже проще - перегрузка операторов может быть очень полезной :)

Кстати, вы почти наверняка захотите:

  • Изменить Валюту как свойство, а не метод
  • Добавьте свойство Amount
  • Возможно, измените тип amount на decimal вместо int
  • Сделайте поля закрытыми и доступными только для чтения
  • Запечатать класс
  • Добавить перегрузки оператора для == и! =
  • Возможно, добавьте перегрузку оператора *, чтобы сделать то же самое, что и Times
  • Избегайте форматирования строки при вычислении хэша (есть десятки ответов, показывающих лучшие реализации хеширования)

РЕДАКТИРОВАТЬ: Я только что перечитал что вы используете пример из книги. Неужели книга действительно скрывает метод Equals , а не отменяет его? Я предлагаю вам купить новую книгу, если так (если это не преднамеренный пример того, когда неправильно использовать сокрытие!) ... какая это книга?

31
ответ дан 3 December 2019 в 02:30
поделиться

Я подозреваю, что ваша проблема в том, что вы не переопределили перегрузку оператора равенства ==. Под капотом Assert.AreEqual, вероятно, используется ==.

См. Учебное пособие по перегрузке операторов .

Обновление: я провел тест NUnit через отладчик, и он действительно использует метод Equals, а не оператор ==.

0
ответ дан 3 December 2019 в 02:30
поделиться

Меня сбивает с толку то, что реализация интерфейса IEquatable, который также имеет метод

Equals(T other)

, поставила передо мной ту же проблему, что и описанная выше.

Единственная причина, по которой я решил использовать интерфейс IEquaytable выше, переопределяя метод Equals, заключалась в том, что мне не нужно было выполнять проверку типа.

В конце концов, мне пришлось использовать следующий код

public bool Equals(CustomTag other)
{
   return (other.Name.Trim().ToLower() == Name.Trim().ToLower());
}

public override bool Equals(object o)
{
    if (o is CustomTag)
    {
        return Equals(o as CustomTag);
    }
    return false;
}

, но потом я подумал, почему бы просто не оставить интерфейс IEquatable таким, какой он есть, и только переопределить метод Equals. (меньше кода = лучше)

1
ответ дан 3 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: