xUnit: Акт два списку <T> рівні?


109

Я новачок у TDD та xUnit, тому хочу перевірити свій метод, який виглядає приблизно так:

List<T> DeleteElements<T>(this List<T> a, List<T> b);

Чи є який-небудь метод Assert, який я можу використовувати? Я думаю, щось подібне було б добре

List<int> values = new List<int>() { 1, 2, 3 };
List<int> expected = new List<int>() { 1 };
List<int> actual = values.DeleteElements(new List<int>() { 2, 3 });

Assert.Exact(expected, actual);

Чи є щось подібне?

Відповіді:


136

xUnit.Net розпізнає колекції, так що вам просто потрібно це зробити

Assert.Equal(expected, actual); // Order is important

Ви можете побачити інші доступні твердження про колекцію у CollectionAsserts.cs

Для колекції бібліотеки NUnit методи порівняння є

CollectionAssert.AreEqual(IEnumerable, IEnumerable) // For sequences, order matters

і

CollectionAssert.AreEquivalent(IEnumerable, IEnumerable) // For sets, order doesn't matter

Детальніше тут: CollectionAssert

MbUnit також має збірки тверджень, схожі на NUnit: Assert.Collections.cs


1
Посилання на вихідний код змінено на xunit.codeplex.com/SourceControl/changeset/view/…
Julien Roncaglia

1
Нове посилання в коментарях також порушено.
Скотт Стаффорд

1
Проект тепер переміщений до GitHub, але я не зміг знайти і той конкретний вихідний файл там.
ПАМ'ЯТ

1
Для складного об'єкта не забувайте, що для цього вам потрібен Equal + GetHasCode або надайте методу Equal користувальницький EqulityComparer
maracuja-сок

2
Метод xUnit Equal повертає значення false для двох IE-чисел з рівним вмістом.
Володимир Кочанчич

31

У поточній версії XUnit (1.5) ви можете просто використовувати

Рівномірність (очікувана, фактична);

Вищеописаний метод буде робити елемент за елементом порівняння двох списків. Я не впевнений, чи працює це для будь-якої попередньої версії.


7
Проблема, з якою я стикався з Assert.Equal для колекцій, полягає в тому, що вона виходить з ладу, якщо елементи колекцій у різному порядку, навіть якщо елементи присутні в обох.
Скотт Лоуренс

1
@ ScottA.Lawrence Списки також замовляють! У вас така ж поведінка з HashSets?
johv

@johv Я ще не тестував це з HashSets, але це гарна ідея. Після того, як у мене була можливість спробувати, я спробую не забути відповісти тут.
Скотт Лоуренс

2
Це також здається невдалим, якщо типи колекцій різні, навіть якщо вони обидва містять однакові предмети в одному порядку.
Джеймс Уайт

3
Але він має дуже хитромудрий вихід. Не говорить вам, де два списки відрізняються! :(
Zordid

16

Якщо xUnit, якщо ви хочете, щоб випробувати властивості кожного елемента для тестування, ви можете використовувати Assert.Collection.

Assert.Collection(elements, 
  elem1 => Assert.Equal(expect1, elem1.SomeProperty),
  elem2 => { 
     Assert.Equal(expect2, elem2.SomeProperty);
     Assert.True(elem2.TrueProperty);
  });

Це перевіряє очікувану кількість та гарантує перевірку кожної дії.


2

Останнім часом я користувався xUnit 2.4.0 іMoq 4.10.1 пакунки в моєму додатку asp.net core 2.2.

У моєму випадку мені вдалося змусити його працювати двома кроками:

  1. Визначення реалізації IEqualityComparer<T>

  2. Передайте екземпляр порівняння як третій параметр у Assert.Trueметод:

    Assert.True(expected, actual, new MyEqualityComparer());

Але є ще один приємний спосіб отримати той же результат, використовуючи пакет FluentAssertions . Це дозволяє зробити наступне:

// Assert          
expected.Should().BeEquivalentTo(actual));

Цікаво, що Assert.Equal()завжди виходить з ладу навіть тоді, коли я замовляв елементи двох списків, щоб отримати їх в одному порядку.


2
щось не в порядку з вашим замовленням BeEquivalentTo не піклується про замовлення (ось чому ваш тест проходить з BeEquivalentTo, а не з assert.Equal)
RagnaRock
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.