Creando arbol recursivo con AutoFixture

Acabo de comenzar a utilizar AutoFixture y tengo esta estructura de datos semicomplejos para la que me gustaría crear algún espécimen. En las pruebas con las que estoy trabajando no me importa demasiado el contenido de la estructura de datos. Sólo quiero valores por defecto razonables.

Parte de esta estructura de datos es un árbol recursivo. Más específicamente, una clase contiene una colección de alguna otra clase que contiene una lista de hijos de sí misma. Algo parecido a:

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;
   }
}

Supongamos que no puedo cambiar fácilmente esta estructura por varias razones.

Si le pido a mi accesorio que cree un ThrowingRecursionBehavior comenzará a ladrar que B es recursivo.

Si sustituyo ThrowingRecursionBehavior con OmitOnRecursionBehavior, obtengo una ObjectCreateException.

Si intento algo como: fixture.Inject (Enumerable.Empty ()); Obtengo "Ya se ha agregado un elemento con la misma clave" del DictionaryFiller. Lo mismo sucede si sustituyo ThrowingRecursionBehavior con NullRecursionBehavior.

Hay varias cosas que me gustaría hacer.

¿Cuál sería la mejor manera de crear un espécimen de A con una lista vacía de Bs?¿Cuál sería la mejor manera de crear un espécimen de A con unas pocas B que contengan unos pocos B con niños con unos pocos niños (un árbol pequeño)?

Para mi último deseo, podría ser bueno especificar alguna profundidad de recursión después de la cual se usó Enumerable.Empty (o una matriz / lista de tamaño cero o incluso nula). Sé que AutoFixture es muy flexible de extender. Así que supongo que debería ser posible crear un generador de muestras que haga exactamente esto. De hecho, intentaré jugar con un ISpecimenBuilder personalizado, pero quizás alguien ya tenga una solución más inteligente. Por ejemplo, tendría sentido modificar esta línea en RecursionGuard:

public object Create(object request, ISpecimenContext context)
{
   if (this.monitoredRequests.Any(x => this.comparer.Equals(x, request)))
   ...

a

public object Create(object request, ISpecimenContext context)
{
   if (this.monitoredRequests.Count(x => this.comparer.Equals(x, request)) > maxAllowedRecursions)
   ...

Respuestas a la pregunta(1)

Su respuesta a la pregunta