Tworzenie drzewa rekurencyjnego z AutoFixture

Właśnie zacząłem używać AutoFixture i mam tę pół-złożoną strukturę danych, dla której chciałbym stworzyć jakiś egzemplarz. W testach, z którymi pracuję, nie obchodzi mnie zbytnio zawartość struktury danych. Chcę tylko rozsądnych wartości domyślnych.

Częścią tej struktury danych jest drzewo rekurencyjne. Bardziej szczegółowo, jedna klasa zawiera kolekcję innej klasy, która zawiera listę samych dzieci. Coś podobnego do:

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

Załóżmy, że nie mogę łatwo zmienić tej struktury z różnych powodów.

Jeśli poproszę moje urządzenie o utworzenie A ThrowingRecursionBehavior, zacznie szczekać o B jako rekurencyjnym.

Jeśli zastąpię ThrowingRecursionBehavior za pomocą OmitOnRecursionBehavior, otrzymam wyjątek ObjectCreateException.

Jeśli spróbuję czegoś takiego: fixture.Inject (Enumerable.Empty ()); Otrzymuję „Element z tym samym kluczem został już dodany” z DictionaryFiller. To samo dzieje się, jeśli zastąpię ThrowingRecursionBehavior NullRecursionBehavior.

Jest kilka rzeczy, które chciałbym.

Jaki byłby najlepszy sposób na stworzenie okazu A z pustą listą Bs?Jaki byłby najlepszy sposób na stworzenie okazu A z kilkoma Bs zawierającymi kilka dzieci B z kilkoma dziećmi (małe drzewo)?

Dla mojego ostatniego życzenia może być fajnie podać jakąś głębokość rekurencji, po której użyto Enumerable.Empty (lub tablicy / listy o zerowej wielkości, a nawet null). Wiem, że AutoFixture jest bardzo elastyczny, aby go rozszerzyć. Przypuszczam więc, że powinno być możliwe stworzenie jakiegoś konstruktora próbek, który dokładnie to robi. W rzeczywistości spróbuję wygłupiać się z niestandardowym ISpecimenBuilderem, ale być może ktoś ma już inteligentniejsze rozwiązanie. Na przykład, czy sensowne byłoby zmodyfikowanie tej linii w rekurencji:

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

do

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

questionAnswers(1)

yourAnswerToTheQuestion