Рекурсия является очень простым методом программирования, и она предоставляет себя такому количеству проблем, что список их похож на список всех проблем, которые могут быть решены при помощи добавления некоторого вида. Просто пройдя мои решения Lisp для Euler Проекта, я нахожу: перекрестная общая функция, функция соответствия цифры, несколько функций для поиска пространства, минимального текстового синтаксического анализатора, функция, разделяющая число на список его десятичных цифр, функция, создающая график и функцию, пересекающую входной файл.
проблема состоит в том, что многие, если не большинство основных языков программирования сегодня не имеет оптимизации последнего вызова так, чтобы глубокая рекурсия не была выполнима с ними. Это несоответствие означает, что большинство программистов вынуждено забыть этот естественный образ мыслей и вместо этого полагаться на другой, возможно менее изящные конструкции цикличного выполнения.
Я бы просто создал массив, используя синтаксис инициализатора коллекции. т.е.
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));
Вы можете просто создать массив. (Массивы реализуют интерфейс 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
.)
List<ICsvTreeGridExportable> myList = new List<ICsvTreeGridExportable>();
myList.Add(mockParent);
myList.Add(mockChild);
return myList;
Вы можете сделать что-то вроде этого:
Создайте функцию Dummy
private IEnumerable<ICsvTreeGridExportable> Dummy()
{
yield return new ICsvTreeGridExportable();
}
И в своей тестовой функции сделайте что-нибудь вроде
private void TestFunction()
{
ThisIsTheOneThatNeedsIenumerable(Dummy());
}
, надеюсь, это поможет
Вот альтернатива ответу Себастьяна, которая позволяет вам указать, сколько манекенов любого типа вы хотите:
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;
}