Dot-Net
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);我可以看到第一個選項在斷言失敗的情況下提供了一個很好的輸出(預期計數……但實際上得到……),而其他兩個選項只輸出“預期……,實際……”除非我通過附加參數提供自定義消息。
我更喜歡:
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 => p.LastName) .And().OnlyHaveUniqueItems(p => p.id);該框架超越了集合,還增加了測試其他主題的可讀性。
// Arrange // Act Action action = () => 8 / 0; // action.Should().Throw<DivideByZeroException>();我與流利的斷言無關。