Dot-Net

NUnit 中最慣用的方式來斷言集合的長度相等

  • April 1, 2014

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);

我可以看到第一個選項在斷言失敗的情況下提供了一個很好的輸出(預期計數……但實際上得到……),而其他兩個選項只輸出“預期……,實際……”除非我通過附加參數提供自定義消息。

我更喜歡:

Assert.That(collection, Has.Count.EqualTo(expectedCount));

僅僅因為.CountandCount()可能被錯誤地覆蓋(如果它們是,應該在不同的單元測試中進行測試,儘管我不知道 nunit 實際上是如何在內部進行計數的)。基本上我不希望我的實際有任何副作用邏輯。呼叫CountorCount()可能應該以如下方式完成:

// Arrange
var expectedCount = 8;

// Act
var list = GetList();
var actualCount = list.Count();

// Assert
Assert.That(actualCount, Is.EqualTo(expectedCount));

兩者讀起來都差不多,但第一個失敗時需要查看的邏輯較少。

更新:2020 年 12 月 1 日

考慮到已收到的讚成票數量,我想我應該提到使用<https://fluentassertions.com/> (FA) 是有利的。這可以用以下方式編寫,並且讀起來更好:

// Arrange

// Act
var list = GetList();

// Assert
list.Should().BeEmpty();

要麼

// Arrange

// Act
var list = GetList();

// Assert
list.Should().HaveCount(8);

要麼

// Arrange

// Act
var list = GetList();

// Assert
list.Should().HaveCountLessThanOrEqualTo(10);

除了 OP 問題,FA 還可以做一些非常高級的收集規則:

// Arrange

// Act
var persons = GetPersons();

// Assert
persons.Should().BeInAscendingOrder(p =&gt; p.LastName)
 .And().OnlyHaveUniqueItems(p =&gt; p.id);

該框架超越了集合,還增加了測試其他主題的可讀性。

// Arrange

// Act
Action action = () =&gt; 8 / 0;

//
action.Should().Throw&lt;DivideByZeroException&gt;();

我與流利的斷言無關。

引用自:https://stackoverflow.com/questions/22778483