如何测试IEnumerable <int>

Ano*_*use 4 .net c# linq collections unit-testing

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

IEnumerable<int> Ids.
Run Code Online (Sandbox Code Playgroud)

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

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

问题是IEnumerable没有计数.

我以为我能够去:

Assert.AreEqual(3, Ids.Count);
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*nna 8

Assert.IsTrue(Ids.SequenceEqual(Enumerable.Range(1, 3));
Run Code Online (Sandbox Code Playgroud)

不仅测试有三个数字,而且通过确保每个元素匹配相应的元素,按顺序测试数字1,2和3 Enumerable.Range(1, 3).

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

CollectionAssert.AreEqual(Enumerable.Range(1, 3), Ids);
Run Code Online (Sandbox Code Playgroud)

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

CollectionAssert.AreEqual(Enumerable.Range(1, 3), Ids.OrderBy(x => x));
Run Code Online (Sandbox Code Playgroud)


Kir*_*huk 6

看看CollectionAssert课程,它验证单元测试中与集合相关的真/假命题.


Jay*_*Jay 5

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

using System.Linq;

…

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

Assert.IsTrue(Ids.Contains(1));
//etc.
Run Code Online (Sandbox Code Playgroud)

如果您想以完全相同的顺序拥有完全相同的项目,还有:

Assert.IsTrue(Ids.SequenceEqual(new List<int>{ 1, 2, 3 }));
Run Code Online (Sandbox Code Playgroud)

根据语义不能保证排序IEnumerable<T>,但这可能不是您特定情况下的结果.