Как я высмеиваю IEnumerable <T>, чтобы я мог протестировать метод, который его получает
У меня есть метод, который я хочу проверить, который ожидает IEnumerable<T>
как параметр.
Я сейчас издеваюсь над содержимым IEnumerable<T>
следующим образом (используя Moq):
var mockParent = new Mock<ICsvTreeGridExportable>();
var mockChild = new Mock<ICsvTreeGridExportable>();
Как это помещать эти издеваемые объекты внутри IEnumerable<T>
, чтобы я мог передать их как параметр метода, который я хочу проверить?
Метод, который я тестирую, ожидает получить IEnumerable<ICsvTreeGridExportable>
Ответы
Ответ 1
Я бы просто создал массив, используя синтаксис сборника intialiser. то есть.
var mockParent = new Mock<ICsvTreeGridExportable>();
var mockChild = new Mock<ICsvTreeGridExportable>();
TestMethod(new[] { mockParent.Object, mockChild.Object });
Массивы в .NET реализуют интерфейс IEnumerable<T>
, поэтому вы все настроены.
Примечание. Если вы хотите "чистый" IEnumerable<T>
(как указывает Лука), вы можете использовать немного LINQ для этого:
TestMethod((new[] { mockParent.Object, mockChild.Object }).TakeWhile(true));
Ответ 2
Вы можете просто создать массив. (Массивы реализуют интерфейс 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;
}
}
(Как упоминает Джейми в комментариях, вам нужно использовать издеваемые объекты, а не объекты Mock
. Например, mockParent.Object
, mockChild.Object
и т.д., а не только mockParent
или mockChild
.)
Ответ 3
Вы можете сделать что-то вроде этого:
Создайте функцию Dummy
private IEnumerable<ICsvTreeGridExportable> Dummy()
{
yield return new ICsvTreeGridExportable();
}
И в вашей тестовой функции сделайте что-то вроде
private void TestFunction()
{
ThisIsTheOneThatNeedsIenumerable(Dummy());
}
надеюсь, что это поможет
Ответ 4
List<ICsvTreeGridExportable> myList = new List<ICsvTreeGridExportable>();
myList.Add(mockParent);
myList.Add(mockChild);
return myList;
Ответ 5
Здесь альтернатива себастианскому ответу, которая позволяет вам указать, сколько макетов любого типа вы хотите:
private IEnumerable<T> GetDummies<T>(int numDummies) where T : new() {
for (int i = 0; i < numDummies; i++) yield return new T();
yield break;
}
Или (если вы хотите использовать возможность использовать типы без пустых конструкторов):
private IEnumerable<T> GetDummies<T>(Func<T> generator, int numDummies) {
for (int i = 0; i < numDummies; i++) yield return generator.Invoke();
yield break;
}