【问题标题】:How to test an IEnumerable<int>如何测试 IEnumerable<int>
【发布时间】:2012-08-24 16:40:41
【问题描述】:

在测试中我需要测试一个对象:

IEnumerable<int> Ids.

该集合包含数字 1,2 和 3。

我主要是想测试一下Ids里面有3个id,1,2,3都存在。

问题是 IEnumerable 没有计数。

我以为我可以去:

Assert.AreEqual(3, Ids.Count);

有谁知道如何做到这一点以及如何确保 1,2 和 3 是其中的实际数字?

【问题讨论】:

标签: c# .net linq unit-testing collections


【解决方案1】:

您可以使用 LINQ 扩展方法来满足这些需求:

using System.Linq;

…

Assert.AreEqual(3, Ids.Count());

Assert.IsTrue(Ids.Contains(1));
//etc.

如果你想以完全相同的顺序拥有完全相同的物品,还有:

Assert.IsTrue(Ids.SequenceEqual(new List<int>{ 1, 2, 3 }));

无法保证根据IEnumerable&lt;T&gt; 的语义进行排序,但这在您的特定场景中可能不会产生影响。

【讨论】:

  • “无法保证订购”是什么意思?虽然IEnumerable&lt;T&gt; 不承诺超出“0 或更多 T”,但如果给定的实现有订单,它将被维护。在给定的情况下,它的保证与例如给定的案例保证 3 个项目。
  • 哦等等。当然,OP 所说的没有任何内容需要Ids 有订单。对不起,我现在知道了。
【解决方案2】:
Assert.IsTrue(Ids.SequenceEqual(Enumerable.Range(1, 3));

通过确保每个元素与Enumerable.Range(1, 3) 中的对应元素匹配,不仅测试存在三个数字,而且测试数字 1、2 和 3 的顺序。

编辑:将此处的 Range 与 Kirill Polishchuk 的回答结合起来,建议:

CollectionAssert.AreEqual(Enumerable.Range(1, 3), Ids);

如果您的 Ids 没有给出排序,最简单的正确性测试是在测试中应用该排序,让我们重新能够应用上述内容:

CollectionAssert.AreEqual(Enumerable.Range(1, 3), Ids.OrderBy(x => x));

【讨论】:

  • 对于通过谷歌偶然打开这个的其他人(就像我一样),CollectionAssert 需要ICollection 作为输入,所以你要么需要转换它(如果你知道对象实际上实现了@987654329 @) 或在IEnumerables 上致电ToList()。
【解决方案3】:

看看CollectionAssert 类,它在单元测试中验证与集合相关的真/假命题。

【讨论】:

    【解决方案4】:

    FluentAssertions 很棒,提供了一组有助于测试的扩展方法:

    这是他们文档的摘录

    IEnumerable collection = new[] { 1, 2, 5, 8 };
    
    collection.Should().NotBeEmpty()
         .And.HaveCount(4)
         .And.ContainInOrder(new[] { 2, 5 })
         .And.ContainItemsAssignableTo<int>();
    
    collection.Should().Equal(new list<int> { 1, 2, 5, 8 });
    collection.Should().Equal(1, 2, 5, 8);
    collection.Should().BeEquivalent(8, 2, 1, 5);
    collection.Should().NotBeEquivalent(8, 2, 3, 5);
    
    collection.Should().HaveCount(c => c > 3).And.OnlyHaveUniqueItems();
    collection.Should().HaveSameCount(new[] {6, 2, 0, 5});
    
    collection.Should().BeSubsetOf(new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, });
    collection.Should().Contain(8).And.HaveElementAt(2, 5).And.NotBeSubsetOf(new[] {11, 56});
    collection.Should().Contain(x => x > 3); 
    collection.Should().Contain(collection, 5, 6); // It should contain the original items, plus 5 and 6.
    collection.Should().OnlyContain(x => x < 10);
    collection.Should().OnlyContainItemsOfType<int>();
    collection.Should().NotContain(82);
    collection.Should().NotContainNulls();
    collection.Should().NotContain(x => x > 10);
    
    collection = new int[0];
    collection.Should().BeEmpty();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      • 2020-12-07
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多