2016-06-12 54 views
1

我剛剛開始學習測試,並有以下問題。我的方法需要IEnumerable<int>參數並返回相同。基本上,它是合併兩個排序arrays/lists的方法,但由於我正在從文件讀取值,我不想使用不必要的內存來創建list or array,所以我決定使用IEnumerable。我有一種方法可以讀取文件並將文件中找到的所有數字轉換爲integers並返回IEnumerable<int>。所以下面的方法使用該結果併合並這些排序的整數。如何測試返回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創建測試用例,但我不知道我應該建立什麼樣採集測試purpose.Idea是做類似如下:

[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

爲什麼你關心的內存使用情況?只需創建一個實現「IEnumerable」的東西。你不能構建一個接口,你必須使用特定的實現。 –

+0

我得到這個權利,你是建議我需要創建一些實現IEnumerable 的集合,比創建該集合的3個實例,前兩個填充值並將它們作爲參數傳遞給我的方法,第三個填充預期的結果?謝謝 –

+0

這就是你在測試中已經完成的測試,看起來好像是單個測試。目前還不清楚你的問題是什麼。 – Charlie

回答

0

CollectionAssertICollection一起使用,因此您應該將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的開始。現在你可以重構和重新測試,直到你變綠。

你可以看一下這個問答&一個Is there an easy way to merge two ordered sequences using LINQ?

2

如果要確定兩個序列是否包含在同一順序的相同元素,調用Enumerable.SequenceEqual。沒有必要將合併的返回序列轉換爲具體的集合。

所以:

var expected = new List<int>{0, 1, 2}; 
var actual = GetSortedIntegers(first, second); 
Assert.IsTrue(expected.SequenceEqual(actual)); 
相關問題