Вы можете использовать CollectionAssert с общими коллекциями. Хитрость заключается в том, чтобы понять, что методы CollectionAssert работают на ICollection
, и хотя некоторые универсальные интерфейсы сбора данных реализуют ICollection
, List<T>
делает.
Таким образом, вы можете обойти это ограничение, используя метод расширения ToList
:
IEnumerable<Foo> expected = //...
IEnumerable<Foo> actual = //...
CollectionAssert.AreEqual(expected.ToList(), actual.ToList());
Тем не менее, я все еще считаю, что CollectionAssert не работает во многих других отношениях, поэтому я склонен использовать Assert.IsTrue с методами расширения LINQ, например:
Assert.IsTrue(expected.SequenceEquals(actual));
FWIW, в настоящее время я использую эти методы расширения для выполнения других сравнений:
public static class EnumerableExtension
{
public static bool IsEquivalentTo(this IEnumerable first, IEnumerable second)
{
var secondList = second.Cast<object>().ToList();
foreach (var item in first)
{
var index = secondList.FindIndex(item.Equals);
if (index < 0)
{
return false;
}
secondList.RemoveAt(index);
}
return secondList.Count == 0;
}
public static bool IsSubsetOf(this IEnumerable first, IEnumerable second)
{
var secondList = second.Cast<object>().ToList();
foreach (var item in first)
{
var index = secondList.FindIndex(item.Equals);
if (index < 0)
{
return false;
}
secondList.RemoveAt(index);
}
return true;
}
}