.net NUnit中最惯用的方法是在集合上声明等长

.net NUnit中最惯用的方法是在集合上声明等长,.net,unit-testing,collections,nunit,assert,.net,Unit Testing,Collections,Nunit,Assert,NUnit2.6最惯用的断言两个集合长度相等的方式是什么,而不管它们的元素值是什么 我可以看到几种表达这种主张的方式。哪一个是首选的,或者使用其中一个是否有缺点/优点 Assert.That(coll1, Has.Count.EqualTo(coll2.Count)); Assert.That(coll1.Count, Is.EqualTo(coll2.Count)); Assert.AreEqual(coll1.Count, coll2.Count); 我可以看到,第一个选项在断言失败的情况

NUnit2.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(coll1.Count(), Is.EqualTo(coll2.Count()));
使用linq并且如果基础集合/可枚举类型发生更改,它在大多数情况下仍然有效,您不需要测试类型,只需要测试计数。这也适用于没有
的东西。例如,对
IDBSet
进行计数。但是我也没有发现
有任何问题。AreEqual
也没有任何问题。如果下一个工程师明白了,那他就是赢家了,嗯?

我更喜欢:

Assert.That(collection, Has.Count.EqualTo(expectedCount));
这仅仅是因为
.Count
Count()
可能被错误地重写(如果是,则应在不同的单元测试中进行测试,尽管我不知道nunit实际上是如何在内部进行计数的)。基本上,我不希望我的实际工作对逻辑产生任何副作用。调用
Count
Count()

// Arrange
var expectedCount = 8;

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

// Assert
Assert.That(actualCount, Is.EqualTo(expectedCount));
两者读起来几乎相同,但第一个失败时,需要检查的逻辑更少

更新:2020年12月1日

考虑到已经收到的投票数,我想我应该提到使用(FA)是有利的。这可以用以下方式书写,并且读起来更好:

// Arrange

// Act
var list = GetList();

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

除了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>();
//排列
//表演
动作动作=()=>8/0;
//
action.Should().Throw();
我与流畅的断言毫无关联

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