Как я высмеиваю 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;
}