Большинство идиоматических способов в 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. Если следующий инженер понимает, то это победитель, а??