Я знаю, что это собирается казаться старомодным, но я не думаю, что большая часть использовании учебных руководств онлайн учит языки программирования или платформы. Они обычно дают Вам не больше, чем немного вкуса языка. Для реального изучения языка Вам нужен эквивалент "книги", и во многих случаях, это означает реальную мертво-древовидную книгу.
, Если Вы хотите изучить C, считайте K& R. Если Вы хотите изучить C++, считайте Stroustrup. Если Вы хотите изучить Lisp/схему, считайте SICP. И т.д.
, Если Вы не готовы потратить больше чем 30$ и несколько часов для изучения языка, Вы, вероятно, не собираетесь изучать его.
Если вы используете MSTest, вы можете взглянуть на CollectionAssert.AreEqual .
Enumerable.SequenceEqual может быть еще одним полезным API для использования в утверждении.
В обоих случаях вы должны подготовить список, содержащий ожидаемый список в ожидаемом порядке, а затем сравнить этот список с результатом.
Вот пример:
var studyFeeds = Feeds.GetStudyFeeds(2120, DateTime.Today.AddDays(-200), 20);
var expectedList = studyFeeds.OrderByDescending(x => x.Date);
Assert.IsTrue(expectedList.SequenceEqual(studyFeeds));
Что-то LINQ-y могло бы использовать отдельный отсортированный запрос ...
var sorted = from item in items
orderby item.Priority
select item;
Assert.IsTrue(items.SequenceEquals(sorted));
Выведение типа означает, что вам понадобится
where T : IHasPriority
Однако, если у вас есть несколько элементов с одинаковым приоритетом , то для утверждения модульного теста вам, вероятно, лучше всего просто выполнить цикл с индексом списка, как предложил Джейсон.
Как насчет:
var list = items.ToList();
for(int i = 1; i < list.Count; i++) {
Assert.IsTrue(yourComparer.Compare(list[i - 1], list[i]) <= 0);
}
где yourComparer
- это экземпляр YourComparer
, который реализует IComparer
. Это гарантирует, что каждый элемент меньше, чем следующий элемент в перечислении.
var studyFeeds = Feeds.GetStudyFeeds(2120, DateTime.Today.AddDays(-200), 20);
var orderedFeeds = studyFeeds.OrderBy(f => f.Date);
for (int i = 0; i < studyFeeds.Count; i++)
{
Assert.AreEqual(orderedFeeds[i].Date, studyFeeds[i].Date);
}
Так или иначе, вам придется пройтись по списку и убедиться, что элементы находятся в том порядке, в котором вы хочу. Поскольку сравнение элементов является настраиваемым, вы можете подумать о создании для этого универсального метода и передаче функции сравнения - точно так же, как при сортировке списка используются функции сравнения.
if(studyFeeds.Length < 2)
return;
for(int i = 1; i < studyFeeds.Length;i++)
Assert.IsTrue(studyFeeds[i-1].Date > studyFeeds[i].Date);
для
еще не умер!
Если в вашей среде модульного тестирования есть вспомогательные методы для подтверждения равенства коллекций, вы должны иметь возможность сделать что-то вроде этого (со вкусом NUnit):
var sorted = studyFeeds.OrderBy(s => s.Date);
CollectionAssert.AreEqual(sorted.ToList(), studyFeeds.ToList());
Метод assert работает с любыми IEnumerable
, но когда обе коллекции имеют тип IList
или «массив чего-то», сообщение об ошибке, выдаваемое при сбое утверждения, будет содержать индекс первого неподходящего элемента.
В .NET 4.0 можно было бы использовать метод Enumerable.Zip
, чтобы заархивировать список со смещением на единицу, который объединяет каждый элемент с последующим элементом в список. Затем вы можете проверить, выполняется ли условие для каждой пары, например
var ordered = studyFeeds.Zip(studyFeeds.Skip(1), (a, b) => new { a, b })
.All(p => p.a.Date < p.b.Date);
. Если вы используете более раннюю версию фреймворка, вы можете без особых проблем написать свой собственный метод Zip, что-то вроде следующего (проверка аргументов и удаление счетчики, если применимо, оставлены читателю):
public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(
this IEnumerable<TFirst> first,
IEnumerable<TSecond> second,
Func<TFirst, TSecond, TResult> selector)
{
var e1 = first.GetEnumerator();
var e2 = second.GetEnumerator();
while (e1.MoveNext() & e2.MoveNext()) // one & is important
yield return selector(e1.Current, e2.Current);
}