为外部集合中的每个项设置内部集合中的元素数

时间:2017-07-11 07:44:39

标签: c# .net nunit

我想检查集合中的每个项目是否都包含具有一定数量元素的集合。现在我按照以下方式这样做:

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

有更好的方法吗?

3 个答案:

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

但它基本上是相同的,循环只是不明确;将对外部集合进行迭代,并验证每个内部集合。