Search code examples
c#autofixture

How to force AutoFixture to create ImmutableList


In System.Collections.Generic there is a very useful ImmutableList. But for this type Autofixture is throwing an exception because it doesn't have public constructor, it's being created like new List<string>().ToImmutableList(). How to tell AutoFixture to populate it?


Solution

  • So thanks to @Mark Seemann I can now answer my question:

    public class ImmutableListSpecimenBuilder : ISpecimenBuilder
    {
        public object Create(object request, ISpecimenContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
    
            var t = request as Type;
            if (t == null)
            {
                return new NoSpecimen();
            }
    
            var typeArguments = t.GetGenericArguments();
            if (typeArguments.Length != 1 || typeof(ImmutableList<>) != t.GetGenericTypeDefinition())
            {
                return new NoSpecimen();
            }
    
            dynamic list = context.Resolve(typeof(IList<>).MakeGenericType(typeArguments));
    
            return ImmutableList.ToImmutableList(list);
        }
    }
    

    And usage:

    var fixture = new Fixture();
    fixture.Customizations.Add(new ImmutableListSpecimenBuilder());
    var result = fixture.Create<ImmutableList<int>>();