Dot-Net

如何模擬 IEnumerable<T> 以便測試接收它的方法

  • November 13, 2009

我有一個我想測試的方法,它需要一個IEnumerable&lt;T&gt;作為參數。

我目前正在模擬以下內容IEnumerable&lt;T&gt;(使用 Moq):

var mockParent = new Mock&lt;ICsvTreeGridExportable&gt;();
var mockChild = new Mock&lt;ICsvTreeGridExportable&gt;();

它如何將這些模擬對象放入 anIEnumerable&lt;T&gt;中,以便我可以將它們作為參數傳遞給我想要測試的方法?

我正在測試的方法預計會收到IEnumerable&lt;ICsvTreeGridExportable&gt;

我只會使用集合初始化器語法創建一個數組。IE

var mockParent = new Mock&lt;ICsvTreeGridExportable&gt;();
var mockChild = new Mock&lt;ICsvTreeGridExportable&gt;();

TestMethod(new[] { mockParent.Object, mockChild.Object });

.NET 中的數組實現了IEnumerable&lt;T&gt;介面,所以一切就緒。

注意:如果你想要一個“純粹的” IEnumerable&lt;T&gt;(正如 Luke 指出的那樣),你可以使用一點 LINQ 來做到這一點:

TestMethod((new[] { mockParent.Object, mockChild.Object }).TakeWhile(true));

你可以只創建一個數組。(數組實現IEnumerable&lt;T&gt;介面。)

var mockEnumerable = new[] { mockParent.Object, mockChild.Object };

如果您想要一個IEnumerable&lt;T&gt;不能轉換回數組等的“純”,那麼您可以使用輔助方法創建它:

var mockEnumerable = CreateEnumerable(mockParent.Object, mockChild.Object);

// ...

public static IEnumerable&lt;T&gt; CreateEnumerable&lt;T&gt;(params T[] items)
{
   foreach (T item in items)
   {
       yield return item;
   }
}

(正如 Jamie 在評論中提到的,您需要使用模擬對象,而不是*Mock*對象。例如mockParent.ObjectmockChild.Object等,不僅僅是mockParentmockChild。)

引用自:https://stackoverflow.com/questions/1728815