Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/47: Рейтинг темы: голосов - 47, средняя оценка - 4.96
 Аватар для zewer
2356 / 1774 / 212
Регистрация: 07.01.2011
Сообщений: 10,342

Unit тестирование и сравнение двух List<T>

08.01.2018, 22:30. Показов 8702. Ответов 7
Метки tdd (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, пишу юнит тест на функцию сортирования при котором я сравниваю 2 листа. 1 уже отсортирован по умолчанию, 2 сортирую.
Тест фейлится, при чем если пройтись дебагером, то видно что все отсортировано правильно. Почему фейл - не понимаю

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        [TestMethod]
        public void TestGetSortedAnimals_2001_2004_2002_2000_2003_TrueReturned()
        {
            List<Animal> actual = new List<Animal>();
            actual.Add(new Donkey("Andalusian", 1.4, "Gomer", 2000));
            actual.Add(new Donkey("Balearic", 0.8, "Gomer", 2001));
            actual.Add(new Donkey("Amiatina", 1.2, "Gomer", 2002));
            actual.Add(new Donkey("American", 0.9, "Gomer", 2003));
            actual.Add(new Horse("Leopard", "Barb", "Felix", 2004));
 
            List<Animal> expected = new List<Animal>();
            expected.Add(new Donkey("Balearic", 0.8, "Gomer", 2001));
            expected.Add(new Horse("Leopard", "Barb", "Felix", 2004));
            expected.Add(new Donkey("Amiatina", 1.2, "Gomer", 2002));
            expected.Add(new Donkey("Andalusian", 1.4, "Gomer", 2000));
            expected.Add(new Donkey("American", 0.9, "Gomer", 2003));
            expected.Sort();
 
            CollectionAssert.AreEqual(actual, expected);
        }
Само сортирование переопределял через интерфейс IComparable<T>
C#
1
2
3
4
        public int CompareTo(Animal other)
        {
            return this.yearOfBirth.CompareTo(other.yearOfBirth);
        }
П.С. Сортирование в программе работает нормально, сам тест фейлится при сравнении [0] элемента.

Добавлено через 7 минут
Тест фейлится даже при таком условии. Честно говоря, делаю так, как пишут много источников в гугле, и что не так - не понимаю

C#
1
2
3
4
5
6
7
8
9
10
11
        [TestMethod]
        public void TestGetSortedAnimals_2001_2004_2002_2000_2003_TrueReturned()
        {
            List<Animal> actual = new List<Animal>();
            actual.Add(new Donkey("Andalusian", 1.4, "Gomer", 2000));
            
            List<Animal> expected = new List<Animal>();           
            expected.Add(new Donkey("Andalusian", 1.4, "Gomer", 2000));
 
            CollectionAssert.AreEqual(actual, expected);
        }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.01.2018, 22:30
Ответы с готовыми решениями:

Unit -тестирование или автоматизированное тестирование
Доброго времени суток. Я программирую «для себя» второй год, на выходе получаются разного рода приложения от постоянно подающих с...

Сравнение двух List
Всем доброго времени суток Прошу помощи! Задача такая есть папка с файлами некоторые файлы увеличиваются в размере нужно определить...

Сравнение двух List<string>
Есть два списка buf1, buf2 В buf1 содержатся символы 6 7 8 9 в buf2 содержатся символы

7
Warrior
 Аватар для _exp10der_
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
08.01.2018, 22:37
zewer, Потому что CollectionAssert.AreEqual(actual, expected); такое сравнение использует Equals в чем можно убедиться получив эксепшен NotImplementedException
https://msdn.microsoft.com/en-... 43763.aspx

Remarks
Two collections are equal if they have the same elements in the same order and quantity. Elements are equal if their values are equal, not if they refer to the same object. The values of elements are compared using Equals by default.


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
 
namespace UnitTestProject1
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var actual = new List<Animal>();
            actual.Add(new Donkey("Andalusian", 1.4, "Gomer", 2000));
            actual.Add(new Donkey("Balearic", 0.8, "Gomer", 2001));
            actual.Add(new Donkey("Amiatina", 1.2, "Gomer", 2002));
            actual.Add(new Donkey("American", 0.9, "Gomer", 2003));
            actual.Add(new Horse("Leopard", "Barb", "Felix", 2004));
 
            var expected = new List<Animal>();
            expected.Add(new Donkey("Balearic", 0.8, "Gomer", 2001));
            expected.Add(new Horse("Leopard", "Barb", "Felix", 2004));
            expected.Add(new Donkey("Amiatina", 1.2, "Gomer", 2002));
            expected.Add(new Donkey("Andalusian", 1.4, "Gomer", 2000));
            expected.Add(new Donkey("American", 0.9, "Gomer", 2003));
            expected.Sort();
 
            CollectionAssert.AreEqual(actual, expected);
        }
    }
 
    internal class Horse : Animal
    {
        private string v1;
        private string v2;
        private string v3;
 
        public Horse(string v1, string v2, string v3, int yearOfBirth)
            : base(yearOfBirth)
        {
            this.v1 = v1;
            this.v2 = v2;
            this.v3 = v3;
        }
    }
 
    internal class Donkey : Animal
    {
        private string v1;
        private double v2;
        private string v3;
 
        public Donkey(string v1, double v2, string v3, int yearOfBirth)
            : base(yearOfBirth)
        {
            this.v1 = v1;
            this.v2 = v2;
            this.v3 = v3;
        }
    }
 
    internal class Animal : IComparable<Animal>
    {
        private readonly int yearOfBirth;
 
        public Animal(int yearOfBirth) => this.yearOfBirth = yearOfBirth;
        public int CompareTo(Animal other) => yearOfBirth.CompareTo(other.yearOfBirth);
 
        public override bool Equals(object obj) => throw new NotImplementedException();
    }
}
1
Warrior
 Аватар для _exp10der_
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
08.01.2018, 22:50
Лучший ответ Сообщение было отмечено zewer как решение

Решение

После сравнение ссылок и количества идет сравнение через
C#
1
IComparer.Compare(enumerator1.Current, enumerator2.Current)
т.к вы не использовали перегрузку без задания своего то использовался дефолтный что видно в исходном коде, смотрел на .net framework 4.7.1
Миниатюры
Unit тестирование и сравнение двух List<T>   Unit тестирование и сравнение двух List<T>  
1
 Аватар для zewer
2356 / 1774 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
08.01.2018, 23:07  [ТС]
Честно говоря, очень сложно понимаю что конкретно вы имеете ввиду.
Но если смотреть на ваш код, то, как я понял, проблема из за того, что я не определил Equals

Переопределил для класса Animal
C#
1
2
3
4
5
6
7
8
9
10
        public override bool Equals(object obj)
        {
            if (obj == null || GetType() != obj.GetType())
                return false;
 
            Animal animal = (Animal)obj;
 
            return (this.name == animal.name) &&
                (this.yearOfBirth == animal.yearOfBirth);
        }
Работает, но только по имени и году рождения (Тест не фейлится). Как мне правильно переопределить его для Donkey и Horse? Мне нужно обращаться к базовому?
0
Warrior
 Аватар для _exp10der_
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
08.01.2018, 23:18
Ну я же не знаю как вы хотите сравнивать, могу дать только пример. Как вы будите сравнивать объекты это ваша полностью ответственность.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
 
namespace UnitTestProject1
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var actual = new List<Animal>();
            actual.Add(new Donkey("Andalusian", 1.4, "Gomer", 2000));
            actual.Add(new Donkey("Balearic", 0.8, "Gomer", 2001));
            actual.Add(new Donkey("Amiatina", 1.2, "Gomer", 2002));
            actual.Add(new Donkey("American", 0.9, "Gomer", 2003));
            actual.Add(new Horse("Leopard", "Barb", "Felix", 2004));
 
            var expected = new List<Animal>();
            expected.Add(new Donkey("Balearic", 0.8, "Gomer", 2001));
            expected.Add(new Horse("Leopard", "Barb", "Felix", 2004));
            expected.Add(new Donkey("Amiatina", 1.2, "Gomer", 2002));
            expected.Add(new Donkey("Andalusian", 1.4, "Gomer", 2000));
            expected.Add(new Donkey("American", 0.9, "Gomer", 2003));
            expected.Sort();
 
            CollectionAssert.AreEqual(actual, expected);
        }
    }
 
    internal class Horse : Animal
    {
        private readonly string v1;
        private readonly string v2;
        private readonly string v3;
 
        public Horse(string v1, string v2, string v3, int yearOfBirth)
            : base(yearOfBirth)
        {
            this.v1 = v1;
            this.v2 = v2;
            this.v3 = v3;
        }
 
        public override bool Equals(object obj) => obj is Horse horse &&
                                                   base.Equals(obj) &&
                                                   v1 == horse.v1 &&
                                                   v2 == horse.v2 &&
                                                   v3 == horse.v3;
    }
 
    internal class Donkey : Animal
    {
        private readonly string v1;
        private readonly double v2;
        private readonly string v3;
 
        public Donkey(string v1, double v2, string v3, int yearOfBirth)
            : base(yearOfBirth)
        {
            this.v1 = v1;
            this.v2 = v2;
            this.v3 = v3;
        }
 
        public override bool Equals(object obj) => obj is Donkey donkey &&
                                                   base.Equals(obj) &&
                                                   v1 == donkey.v1 &&
                                                   Math.Abs(v2 - donkey.v2) < 0.1 &&
                                                   v3 == donkey.v3;
    }
 
    internal class Animal : IComparable<Animal>
    {
        private readonly int yearOfBirth;
 
        public Animal(int yearOfBirth) => this.yearOfBirth = yearOfBirth;
        public int CompareTo(Animal other) => yearOfBirth.CompareTo(other.yearOfBirth);
 
        public override bool Equals(object obj) => obj is Animal animal &&
                                                   yearOfBirth == animal.yearOfBirth;
    }
}
1
 Аватар для zewer
2356 / 1774 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
08.01.2018, 23:18  [ТС]
Для класса Donkey определил таким образом

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        /// <summary>
        /// Method which return sorted list of Animals
        /// </summary>
        /// <param name="obj">Animal object.</param>
        /// <returns>Return true if kind and height are same </returns>
        public override bool Equals(object obj)
        {
            if (obj == null || GetType() != obj.GetType())
            {
                return false;
            }
 
            Donkey animal = (Donkey)obj;
 
            return (this.kind == animal.kind) &&
                (this.height == animal.height);
        }
Вроде работает теперь по всем параметрам и тест не фейлится. Подход верный?
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
08.01.2018, 23:18
Цитата Сообщение от zewer Посмотреть сообщение
Работает, но только по имени и году рождения (Тест не фейлится). Как мне правильно переопределить его для Donkey и Horse? Мне нужно обращаться к базовому?
переопределить во всех классах, которые надо сравнивать. вызов base можно не делать, если самому провести все нужные проверки в дочерних.
0
 Аватар для zewer
2356 / 1774 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
08.01.2018, 23:29  [ТС]
Все таки пришлось вызвать base

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
         public override bool Equals(object obj)
        {
            if (obj == null || GetType() != obj.GetType())
            {
                return false;
            }
 
            Donkey animal = (Donkey)obj;
 
            return (this.kind == animal.kind) &&
                (this.height == animal.height) &&
                base.Equals(obj);
        }
Теперь вроде работает, спасибо за подсказки
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.01.2018, 23:29
Помогаю со студенческими работами здесь

Сравнение содержимого двух List - ов
Проблема вот в чем, есть два List - a, только у одного размерность на много больше другого, как сделать так, что бы каждый элемент первого...

Сравнение двух List<string>
Есть 2 листа public static List&lt;string&gt; sFullFileName = new List&lt;string&gt;(); public static List&lt;string&gt; sReportFileName = new...

Ускорить сравнение двух List<>
Нужно сравнить два листа, если объекта из первого листа нет во втором, то нужно добавить его в третий. Сейчас у меня сделано так: Класс...

Сравнение двух list разных размеров
Здравствуйте. Есть два List. В первом 50 записей, в другом 6 записей. Как можно проверить наличие записей из второго List в первом? Я...

Алгоритм сравнение двух списков list, для синхронизации таблицы
Добрый день форумчане. Очень нужна ваша помощь, срочно. Необходимо сделать синхронизацию локальной таблицы с таблицей загруженной из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru