Создание рекурсивного дерева с помощью 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)
   ...

Ответы на вопрос(1)

Ваш ответ на вопрос