我想检查集合中的每个项目是否都包含具有一定数量元素的集合。现在我按照以下方式这样做:
// Given
CollectionGenerator collectionGenerator = new CollectionGenerator (outerCollectionSize, innerCollectionSize);
// When
ICollection<SomeEntity> outerCollection = collectionGenerator.GenerateCollection();
// Then
foreach (SomeEntity someEntity in outerCollection)
{
Assert.AreEqual(innerCollectionSize, someEntity.InnerCollection.Count);
}
有更好的方法吗?
答案 0 :(得分:2)
您可以使用AllItemsConstraint
并执行以下操作:
Assert.That(outerCollection.Select(c => c.InnerCollection).ToList(),
Has.All.Count.EqualTo(innerCollectionSize));
当测试失败时,这会给出更好的消息,例如:
Expected: all items property Count equal to 2
But was: < < 1, 2 >, < 1, 2, 3 > >
请注意,ToList
很重要,因为可枚举项没有Count
属性。
根据Chris'建议,你也可以这样做:
Assert.That(outerCollection.Select(c => c.InnerCollection),
Has.All.With.Exactly(innerCollectionSize).Items);
如果您确实想保留循环,则应将其嵌入Assert.Multiple
(仅在NUnit 3中可用),以便您获得所有失败,而不仅仅是第一个失败:
Assert.Multiple(() =>
{
foreach (SomeEntity someEntity in outerCollection)
{
Assert.AreEqual(innerCollectionSize, someEntity.InnerCollection.Count);
}
});
答案 1 :(得分:1)
关于Scroog1's答案的最后一次迭代 - 更加“语义断言” - 您还可以执行以下操作:
Assert.That(outerCollection,
Has.All.Property(nameof(CollectionGenerator.InnerCollection))
.Exactly(innerCollectionSize).Items);
这会给出类似的错误消息:
1) Failed : NUnitLite.Tests.Program.MyTest
Expected: all items property InnerCollection exactly 2 items
But was: < <CollectionGenerator> >
根据您的CollectionGenerator.ToString()
方法的用途,这可能会有用。我喜欢它,因为现在您正在测试InnerCollection
属性时从错误消息中显而易见 - 虽然它可能确实开始变得有点啰嗦。
答案 2 :(得分:0)
您可以执行以下操作:
Assert.IsTrue(outerCollection.All(inner => inner.Length == innerCollectionSize);
但它基本上是相同的,循环只是不明确;将对外部集合进行迭代,并验证每个内部集合。