xUnit: утверждать два списка <T>равны? - PullRequest
83 голосов
/ 07 января 2009

Я новичок в 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);

Есть ли что-то подобное?

Ответы [ 4 ]

98 голосов
/ 07 января 2009

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

29 голосов
/ 09 августа 2009

В текущей версии XUnit (1.5) вы можете просто использовать

Assert.Equal (ожидаемый, фактический);

Приведенный выше метод будет выполнять поэлементное сравнение двух списков. Я не уверен, что это работает для любой предыдущей версии.

11 голосов
/ 31 августа 2016

С xUnit, если вы хотите выбрать свойства каждого элемента для проверки, вы можете использовать Assert.Collection.

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

Это проверяет ожидаемое количество и гарантирует, что каждое действие проверено.

0 голосов
/ 26 апреля 2019

Недавно я использовал пакеты 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() всегда дает сбой, даже когда я заказал элементы двух списков, чтобы получить их в одном порядке.

...