Создание рекурсивного дерева с помощью AutoFixture
Я только начал использовать AutoFixture и имею эту полусложную структуру данных, для которой я хотел бы создать образец. В тестах, с которыми я работаю, меня не слишком заботит содержание структуры данных. Я просто хочу разумные значения по умолчанию.
Частью этой структуры данных является рекурсивное дерево. Более конкретно, один класс содержит коллекцию другого класса, который содержит список своих дочерних элементов. Что-то похожее на:
public class A
{
private IEnumerable<B> bNodes;
public A(IEnumerable<B> bNodes)
{
this.bNodes = bNodes;
}
}
public class B
{
private IEnumerable<B> children;
public B(IEnumerable<B> children)
{
this.children = children;
}
}
Допустим, я не могу легко изменить эту структуру по разным причинам.
Если я попрошу, чтобы мой прибор создал A ThrowingRecursionBehavior, он начнет лаять, что B рекурсивен.
Если я заменяю ThrowingRecursionBehavior на OmitOnRecursionBehavior, я получаю исключение ObjectCreateException.
Если я попробую что-то вроде: fixture.Inject (Enumerable.Empty ()); Я получаю «Элемент с таким же ключом уже был добавлен» из DictionaryFiller. То же самое происходит, если я заменю ThrowingRecursionBehavior на NullRecursionBehavior.
Есть несколько вещей, которые я бы хотел.
Каков наилучший способ создать образец A с пустым списком B?Каков наилучший способ создать образец A с несколькими B, содержащими несколько B-детей с несколькими детьми (маленькое дерево)?Для моего последнего желания было бы неплохо указать некоторую глубину рекурсии, после которой использовался Enumerable.Empty (или массив нулевого размера / List или даже null). Я знаю, что AutoFixture очень гибок в расширении. Так что я полагаю, что возможно создать конструктор образцов, который сделает именно это. На самом деле я постараюсь дурачиться с пользовательским ISpecimenBuilder, но, возможно, у кого-то уже есть более разумное решение. Например, имеет ли смысл изменить эту строку в RecursionGuard:
public object Create(object request, ISpecimenContext context)
{
if (this.monitoredRequests.Any(x => this.comparer.Equals(x, request)))
...
в
public object Create(object request, ISpecimenContext context)
{
if (this.monitoredRequests.Count(x => this.comparer.Equals(x, request)) > maxAllowedRecursions)
...