C# 为外部集合中的每个项断言内部集合中的元素数

C# 为外部集合中的每个项断言内部集合中的元素数,c#,.net,nunit,C#,.net,Nunit,我想检查集合中的每个项是否都有包含一些元素的集合。目前,我正在以以下方式进行: // Given CollectionGenerator collectionGenerator = new CollectionGenerator (outerCollectionSize, innerCollectionSize); // When ICollection<SomeEntity> outerCollection = collectionGenerator.GenerateCollec

我想检查集合中的每个项是否都有包含一些元素的集合。目前,我正在以以下方式进行:

// 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);
}
//给定
CollectionGenerator CollectionGenerator=新的CollectionGenerator(outerCollectionSize,innerCollectionSize);
//什么时候
ICollection outerCollection=collectionGenerator.GenerateCollection();
//然后
foreach(outerCollection中的SomeEntity SomeEntity)
{
AreEqual(innerCollectionSize,someEntity.InnerCollection.Count);
}

有更好的方法吗?

您可以执行以下操作:

Assert.IsTrue(outerCollection.All(inner => inner.Length == innerCollectionSize);
但它基本上等于同一件事,循环只是不明确;将迭代outercollection,并验证每个innercollection。

您可以使用并执行以下操作:

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 > >
如果确实希望保留循环,则应将其嵌入到(仅在NUnit 3中可用)中,以便获得所有失败,而不仅仅是第一个失败:

Assert.Multiple(() =>
{
    foreach (SomeEntity someEntity in outerCollection)
    {
        Assert.AreEqual(innerCollectionSize, someEntity.InnerCollection.Count);
    }
});
关于答案的最后一次迭代——为了更加“语义自信”——您还可以执行以下操作:

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> >
1)失败:NUnitLite.Tests.Program.MyTest
应为:所有项属性InnerCollection正好有2项
但是是:<>

这可能很有用,具体取决于
CollectionGenerator.ToString()
方法的有用程度。我喜欢它,因为现在您正在测试
InnerCollection
属性,从错误消息中可以看出这一点——尽管它可能开始有点冗长。

为了避免
.ToList()
我想您可以改为
Has.All.justice(innerCollectionSize).Items
)带着来自利兹的爱!对齐:
Has.Count
Has.Property(“Count”)
的同义词,当然,IEnumerables没有。ExactCountConstraint(
具有.execute(x).Items
)是独立于实现的,我认为。所以您可以。很好。我清楚地想到了其他的
。ToList
情况,其中一个会得到:
但是是:`或类似;作为最后一次迭代,您还可以使用PropertyConstraint,而不是左侧的LINQ,因此所有关于测试内容的信息都包含在约束中。这可能开始有点冗长,但是,请参见=)
1) Failed : NUnitLite.Tests.Program.MyTest
   Expected: all items property InnerCollection exactly 2 items
   But was:  < <CollectionGenerator> >