Как мне высмеять IEnumerable <T>, чтобы я мог протестировать метод, который его получает - PullRequest
15 голосов
/ 13 ноября 2009

У меня есть метод, который я хочу проверить, который ожидает IEnumerable<T> в качестве параметра.

В настоящее время я высмеиваю содержимое IEnumerable<T> следующим образом (используя Moq):

 var mockParent = new Mock<ICsvTreeGridExportable>();
 var mockChild = new Mock<ICsvTreeGridExportable>();

Как поместить эти макеты в IEnumerable<T>, чтобы я мог передать их в качестве параметра методу, который я хочу проверить?

Метод, который я тестирую, ожидает получить IEnumerable<ICsvTreeGridExportable>

Ответы [ 5 ]

20 голосов
/ 13 ноября 2009

Я бы просто создал массив, используя синтаксис инициализатора коллекции. т.е.

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));
6 голосов
/ 13 ноября 2009

Вы можете просто создать массив. (Массивы реализуют интерфейс 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.)

1 голос
/ 13 ноября 2009

Вы можете сделать что-то вроде этого:
Создать функцию Dummy

private IEnumerable<ICsvTreeGridExportable> Dummy()
{
     yield return new ICsvTreeGridExportable();
}

И в вашей тестовой функции сделайте что-то вроде

private void TestFunction()
{
   ThisIsTheOneThatNeedsIenumerable(Dummy());
}

надеюсь, это поможет

0 голосов
/ 13 ноября 2009

Вот альтернатива ответу Себастьяна, который позволяет указать, сколько манекенов любого типа вы хотите:

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;
}
0 голосов
/ 13 ноября 2009
List<ICsvTreeGridExportable> myList = new List<ICsvTreeGridExportable>();
myList.Add(mockParent);
myList.Add(mockChild);
return myList;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...