在测试中我需要测试一个对象:
IEnumerable<int> Ids.
该集合包含数字 1,2 和 3。
我基本上想测试Ids中有三个id并且1,2和3都存在。
问题是 IEnumerable 没有计数。
我以为我可以去:
Assert.AreEqual(3, Ids.Count);
任何人都知道如何做到这一点以及如何确保 1,2 和 3 是其中的实际数字?
在测试中我需要测试一个对象:
IEnumerable<int> Ids.
该集合包含数字 1,2 和 3。
我基本上想测试Ids中有三个id并且1,2和3都存在。
问题是 IEnumerable 没有计数。
我以为我可以去:
Assert.AreEqual(3, Ids.Count);
任何人都知道如何做到这一点以及如何确保 1,2 和 3 是其中的实际数字?
Assert.IsTrue(Ids.SequenceEqual(Enumerable.Range(1, 3));
通过确保每个元素与Enumerable.Range(1, 3)
.
编辑:将Range
from here 与 Kirill Polishchuk 的回答结合起来,建议:
CollectionAssert.AreEqual(Enumerable.Range(1, 3), Ids);
如果您Ids
没有给出排序,最简单的正确性测试是在测试中应用该排序,让我们重新能够应用上述内容:
CollectionAssert.AreEqual(Enumerable.Range(1, 3), Ids.OrderBy(x => x));
您可以使用 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>
,但这在您的特定场景中可能不会产生影响。
看一下CollectionAssert
类,它在单元测试中验证与集合相关的真/假命题。
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();