我刚刚开始学习测试,并且遇到了以下问题。我的方法接受IEnumerable<int>
参数并返回相同的内容。基本上,它是合并两个已排序arrays/lists
的方法但是因为我&# 39;从文件中读取值,我不想使用不必要的内存来创建list or array
,所以我决定使用IEnumerable
。我有一个方法可以读取文件并将文件中找到的所有数字转换为integers
并返回IEnumerable<int>
。因此,以下方法使用该结果并合并那些排序的整数。
public static IEnumerable<int> GetSortedIntegers(IEnumerable<int> first , IEnumerable<int> second)
{
var item1 = first.GetEnumerator();
var item2 = second.GetEnumerator();
bool item1HasNext = item1.MoveNext();
bool item2HasNext = item2.MoveNext();
while (item1HasNext && item2HasNext)
{
if (item1.Current > item2.Current)
{
yield return item2.Current;
item2HasNext = item2.MoveNext();
}
else if(item1.Current == item2.Current)
{
yield return item2.Current;
item2HasNext = item2.MoveNext();
item1HasNext = item1.MoveNext();
}
else
{
yield return item1.Current;
item1HasNext = item1.MoveNext();
}
}
while (item1.MoveNext())
{
yield return item1.Current;
}
while (item2.MoveNext())
{
yield return item2.Current;
}
}
我想测试此方法的功能并使用Nunit
创建测试用例,但我不知道我应该为测试目的创建哪些集合。想要做的事情如下:
[Test]
public static void GetSortedIntegersTest()
{
var first = new List<int>() { 0 };
var second = new List<int>() { 1, 2 };
var expected = new List<int>{ 0, 1, 2 };
var actual = GetSortedIntegers(first, second);
CollectionAssert.AreEqual(expected, actual);
}
感谢您的建议。
答案 0 :(得分:2)
如果要确定两个序列是否包含相同顺序的相同元素,请调用Enumerable.SequenceEqual。没有必要将合并的返回序列转换为具体集合。
所以:
var expected = new List<int>{0, 1, 2};
var actual = GetSortedIntegers(first, second);
Assert.IsTrue(expected.SequenceEqual(actual));
答案 1 :(得分:0)
CollectionAssert
适用于ICollection
,因此您应将actual
转换为列表。
[Test]
public static void GetSortedIntegersTest()
{
var first = new List<int>() { 0 };
var second = new List<int>() { 1, 2 };
var expected = new List<int>{ 0, 1, 2 };
var actual = GetSortedIntegers(first, second);
CollectionAssert.AreEqual(expected, actual.ToList());
}
您当前的测试将失败,但它是RGR的开始。现在你可以重构并重新测试,直到你变绿。
您可以查看此Q&amp; A Is there an easy way to merge two ordered sequences using LINQ?