Dot-Net
如何模擬 IEnumerable<T> 以便測試接收它的方法
我有一個我想測試的方法,它需要一個
IEnumerable<T>作為參數。我目前正在模擬以下內容
IEnumerable<T>(使用 Moq):var mockParent = new Mock<ICsvTreeGridExportable>(); var mockChild = new Mock<ICsvTreeGridExportable>();它如何將這些模擬對象放入 an
IEnumerable<T>中,以便我可以將它們作為參數傳遞給我想要測試的方法?我正在測試的方法預計會收到
IEnumerable<ICsvTreeGridExportable>
我只會使用集合初始化器語法創建一個數組。IE
var mockParent = new Mock<ICsvTreeGridExportable>(); var mockChild = new Mock<ICsvTreeGridExportable>(); TestMethod(new[] { mockParent.Object, mockChild.Object });.NET 中的數組實現了
IEnumerable<T>介面,所以一切就緒。注意:如果你想要一個“純粹的”
IEnumerable<T>(正如 Luke 指出的那樣),你可以使用一點 LINQ 來做到這一點:TestMethod((new[] { mockParent.Object, mockChild.Object }).TakeWhile(true));
你可以只創建一個數組。(數組實現
IEnumerable<T>介面。)var mockEnumerable = new[] { mockParent.Object, mockChild.Object };如果您想要一個
IEnumerable<T>不能轉換回數組等的“純”,那麼您可以使用輔助方法創建它:var mockEnumerable = CreateEnumerable(mockParent.Object, mockChild.Object); // ... public static IEnumerable<T> CreateEnumerable<T>(params T[] items) { foreach (T item in items) { yield return item; } }(正如 Jamie 在評論中提到的,您需要使用模擬對象,而不是*
Mock*對象。例如mockParent.Object,mockChild.Object等,而不僅僅是mockParent或mockChild。)