Большинство идиоматических способов в NUnit утверждать равную длину для коллекций
Какой самый идиоматический способ с NUnit 2.6 утверждать, что две коллекции имеют равную длину, независимо от значений их элементов?
Я могу видеть несколько способов выражения этого утверждения. Какой из них предпочтительнее или есть недостатки/преимущества при использовании одного или другого?
Assert.That(coll1, Has.Count.EqualTo(coll2.Count));
Assert.That(coll1.Count, Is.EqualTo(coll2.Count));
Assert.AreEqual(coll1.Count, coll2.Count);
Я вижу, что первый вариант обеспечивает хороший вывод в случае, если утверждение не выполнено (ожидаемый счетчик... но на самом деле получил...), тогда как другие два варианта выводят только "Ожидаемые..., актуальные..." если я не предоставил пользовательское сообщение через дополнительный параметр.
Ответы
Ответ 1
Я предпочитаю:
Assert.That(collection, Has.Count.EqualTo(expectedCount));
Просто потому, что .Count
и Count()
могут быть неправильно переопределены (которые должны быть протестированы в другом unit test, если они есть, хотя я не знаю, как nunit фактически выполняет подсчет внутри). Баснически я не хочу, чтобы моя реальность имела какую-либо сторону, влияющую на логику. Вызов Count
или Count()
должен, вероятно, быть выполнен в следующем действии:
// Arrange
var expectedCount = 8;
// Act
var list = GetList();
var actualCount = list.Count();
// Assert
Assert.That(actualCount, Is.EqualTo(expectedCount));
Оба читаются одинаково, но первый из них имеет меньше логики для просмотра, когда он терпит неудачу.
Ответ 2
Я думаю, что это личное предпочтение, но для меня нужно:
Assert.That(coll1.Count(), Is.EqualTo(coll2.Count()));
Используя linq, и если базовый тип коллекции /Enumerable изменился, он все равно будет работать в большинстве случаев, вы не будете тестировать тип только как счетчик. Это также работает для вещей, которые не имеют .Count
для них, например, IDBSet
. Но опять же я не вижу ничего плохого в .AreEqual
. Если следующий инженер понимает, то это победитель, а??