Как я дразню IEnumerable <T> так, чтобы я мог протестировать метод, который получает его

Рекурсия является очень простым методом программирования, и она предоставляет себя такому количеству проблем, что список их похож на список всех проблем, которые могут быть решены при помощи добавления некоторого вида. Просто пройдя мои решения Lisp для Euler Проекта, я нахожу: перекрестная общая функция, функция соответствия цифры, несколько функций для поиска пространства, минимального текстового синтаксического анализатора, функция, разделяющая число на список его десятичных цифр, функция, создающая график и функцию, пересекающую входной файл.

проблема состоит в том, что многие, если не большинство основных языков программирования сегодня не имеет оптимизации последнего вызова так, чтобы глубокая рекурсия не была выполнима с ними. Это несоответствие означает, что большинство программистов вынуждено забыть этот естественный образ мыслей и вместо этого полагаться на другой, возможно менее изящные конструкции цикличного выполнения.

15
задан skaffman 13 November 2009 в 12:40
поделиться

5 ответов

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

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

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

Массивы в .NET реализуют интерфейс IEnumerable , так что все готово.

Примечание. Если вам нужен «чистый» IEnumerable (как указывает Люк), вы могли бы использовать для этого немного LINQ:

TestMethod((new[] { mockParent.Object, mockChild.Object }).TakeWhile(true));
20
ответ дан 1 December 2019 в 02:37
поделиться

Вы можете просто создать массив. (Массивы реализуют интерфейс IEnumerable .)

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

Если вам нужен «чистый» IEnumerable , который не может быть преобразован обратно в массив и т. Д., Тогда вы можете создать его с помощью вспомогательного метода:

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 .)

6
ответ дан 1 December 2019 в 02:37
поделиться
List<ICsvTreeGridExportable> myList = new List<ICsvTreeGridExportable>();
myList.Add(mockParent);
myList.Add(mockChild);
return myList;
0
ответ дан 1 December 2019 в 02:37
поделиться

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

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

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

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

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

1
ответ дан 1 December 2019 в 02:37
поделиться

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

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
ответ дан 1 December 2019 в 02:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: