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?
How to force AutoFixture to create ImmutableList
Asked Answered
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>>();
You can just create an extension for your tests and register ImmutableHashSet<string>
to be created from ImmutableHashSet<string>.Empty
.
public static class AutoFixtureExtensions
{
public static Fixture DefaultCustomizations(this Fixture autofixture)
{
autofixture.Register(() => ImmutableHashSet<string>.Empty);
return autofixture;
}
}
And use it in your tests like this:
var result = new Fixture().DefaultCustomizations().Create<ImmutableList<int>>();
Something like
fixture.Register((List<string> l) => l.ToImmutableList());
ought to do it.
Works great for string! Is it any way to make it generic for all types? –
Leonteen
@Leonteen That's a bit more involved, but you should be able to write an
ISpecimenBuilder
like ListRelay. –
Lieutenancy Looks like there is a nuget package to solve this:
https://www.nuget.org/packages/AutoFixture.Community.ImmutableCollections/#
© 2022 - 2024 — McMap. All rights reserved.