Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> NUnit сравнение объектов 
V
    Опции темы
mullih
Дата 3.8.2007, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 19.12.2006

Репутация: нет
Всего: 2



Добрый день 
Начал изучать NUnit и столкнулся с такой проблемой. При проверке на равенство двух одинаковых объектов не выполняется тест
Код

namespace NUnit_Test {
    public class Dollar {
        public int amount;

        public Dollar(int amount) {
            this.amount = amount;
        }

    }

    [TestFixture]
    public class DollarTest {

        [Test]
        public void testMultiplication() {
            Dollar five = new Dollar(5);
            Assert.AreEqual(five, new Dollar(5));
        }
    }
}



Подскажите пожалуйста почему Assert.AreEqual(five, new Dollar(5)); выкидывает исключение?

Это сообщение отредактировал(а) mullih - 3.8.2007, 10:52
PM MAIL WWW Skype   Вверх
anonym
Дата 3.8.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 27.11.2006

Репутация: 3
Всего: 3



Не знаю, что такое NUnit, но есть предположение, что Assert.AreEqual для ссылочных типов сравнивает адреса объектов в памяти. Очевидно, второй созданный обхект new Dollar(5) расположени уже совсем не там, где первый.
PM MAIL   Вверх
andrx
Дата 3.8.2007, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Андрей
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 16.12.2005
Где: Киев

Репутация: 1
Всего: 4



anonym 
поддерживаю

mullih 
посмотри здесь

Это сообщение отредактировал(а) andrx - 3.8.2007, 11:53
--------------------
Лучше скажи мало, но хорошо. (Козьма Прутков)
PM MAIL ICQ   Вверх
mihryak
Дата 3.8.2007, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



если хочешь, чтобы экземпляры сравнивались по свойству amount заоверрайдь метод Equals() в классе Dollar.
Код

            public override bool Equals(object obj)
            {
                if (!(obj is Dollar))
                {
                    return false;
                }

                return ((Dollar)obj).amount == amount;
            }

PM MAIL ICQ   Вверх
mullih
Дата 3.8.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 19.12.2006

Репутация: нет
Всего: 2



Спасибо за помощь 
На самом деле надо было переопределить Equals
Сам не подумал что AreEqual привязана к этому методу класса
Тему можно закрывать
PM MAIL WWW Skype   Вверх
Wizard_Memfis
Дата 6.8.2007, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 12.2.2007
Где: г. Донецк, Украин а

Репутация: 1
Всего: 4



Также можно без переопределения метода сравнить самому поля этих объектов!Тогда твой код будет без изменений!Это уже кому как нравится! smile 
--------------------
www.binary-studio.com
PM MAIL WWW ICQ Skype   Вверх
Naum
Дата 6.8.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



Цитата(Wizard_Memfis @  6.8.2007,  12:19 Найти цитируемый пост)
Это уже кому как нравится!

Я бы сказал зависит от нужд приложения. У юнит-тестирования есть одна проблемка: иногда код приложения начинают писать, чтобы только тесты не падали.
Если тебе не надо переопределять Equals, то и не надо делать это ради тестов, а лучше 
Цитата(Wizard_Memfis @  6.8.2007,  12:19 Найти цитируемый пост)
без переопределения метода сравнить самому поля этих объектов

Если же ты намереваешься где-либо еще, кроме тестов, пользоваться этим методом, тогда, конечно, надо переопределить. smile



--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
mihryak
Дата 6.8.2007, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Wizard_Memfis, не лучший вариант, при любом изменении критериев сравнения их придётся искать по всему коду и править, а так в Equals всё локализовано.
Если поле для сравнения нужно не одно (чаще всё же одно, нечто вроде идентификатора), а все свойства, то можно в тот же Equals написать так, чтобы он все эти свойства вытаскивал через рефлексию. Это даст возможность не переписывать Equals после каждого изменения списка свойств.

Ещё можно переопределить оператор ==, что может дать дополнительные удобства при написании кода.

Это сообщение отредактировал(а) mihryak - 6.8.2007, 13:39
PM MAIL ICQ   Вверх
mullih
Дата 7.8.2007, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 19.12.2006

Репутация: нет
Всего: 2



Цитата(mihryak @ 6.8.2007,  13:27)
Если поле для сравнения нужно не одно (чаще всё же одно, нечто вроде идентификатора), а все свойства, то можно в тот же Equals написать так, чтобы он все эти свойства вытаскивал через рефлексию. Это даст возможность не переписывать Equals после каждого изменения списка свойств.

А можно привести маленький пример как свойства вытаскивать через рефлексию 
У меня получилось найти только public поля 
PM MAIL WWW Skype   Вверх
mihryak
Дата 7.8.2007, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



в параметр BindingFlags добавь BindingFlags.NonPublic
PM MAIL ICQ   Вверх
mihryak
Дата 7.8.2007, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Код

    public class PropertiesTestClass
    {
        private string privateStringValue = "private";
        private string publicStringValue = "public";

        private string PrivateStringValue
        {
            get { return privateStringValue; }
            set { privateStringValue = value; }
        }

        public string PublicStringValue
        {
            get { return publicStringValue; }
            set { publicStringValue = value; }
        }
    }

    public static void Main()
    {
        PropertiesTestClass test = new PropertiesTestClass();

        PropertyInfo[] propertiesInfo =
            test.GetType().GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);

        foreach (PropertyInfo propertyInfo in propertiesInfo)
        {
            Console.WriteLine(propertyInfo.Name);
            Console.WriteLine(test.GetType().InvokeMember(propertyInfo.Name,
               BindingFlags.Public | BindingFlags.NonPublic |
               BindingFlags.Instance | BindingFlags.GetProperty,
               null, test, null));
        }

        Console.ReadKey();
    }

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0487 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.