I have just started using AutoFixture and have this semi-complex data structure that I would like to create some specimen for. In the tests I am working with I don't care too much about content of the data structure. I just want reasonable default values.
Part of this data structure is a recursive tree. More specific, one class holds a collection of some other class that contains a list of children of itself. Something akin to:
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;
}
}
Lets assume I cannot easily change this structure for various reasons.
If I ask my fixture to create A ThrowingRecursionBehavior will start barking about B being recursive.
If I replace ThrowingRecursionBehavior with OmitOnRecursionBehavior I get an ObjectCreateException.
If I try something like: fixture.Inject(Enumerable.Empty()); I get "An item with the same key has already been added" from the DictionaryFiller. The same thing happens if I replace ThrowingRecursionBehavior with NullRecursionBehavior.
There are several things I would like to.
- What would be the best way to create a specimen of A with an empty list of Bs?
- What would be the best way to create a specimen of A with a few Bs containing a few B-children with a few children (a small tree)?
For my last wish it could be nice to specify some recursion depth after which Enumerable.Empty was used (or a zero sized array / List or even null). I know that AutoFixture is very flexible to extend. So I suppose it should be possible to create some specimen builder that does exactly this. In fact I will try fooling around with a custom ISpecimenBuilder, but perhaps someone has a smarter solution already. For example, would it make sense to modify this line in RecursionGuard:
public object Create(object request, ISpecimenContext context)
{
if (this.monitoredRequests.Any(x => this.comparer.Equals(x, request)))
...
to
public object Create(object request, ISpecimenContext context)
{
if (this.monitoredRequests.Count(x => this.comparer.Equals(x, request)) > maxAllowedRecursions)
...