如何测试IEnumerable <int> </int>

时间:2012-08-30 01:17:56

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

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

IEnumerable<int> Ids.

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

我基本上想测试一下ID中有三个ID,而且1,2和3都存在。

问题是IEnumerable没有计数。

我以为我能够去:

Assert.AreEqual(3, Ids.Count);

任何人都知道如何做到这一点以及如何确保1,2和3是那里的实际数字?

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:5)

您可以使用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<T>的语义无法保证排序,但在您的特定情况下可能不会产生影响。

答案 2 :(得分:5)

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

答案 3 :(得分:3)

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