Dans System.Collections.Generic, il existe une liste ImmutableList très utile. Mais pour ce type Autofixture lève une exception car il n'a pas de constructeur public, il est créé comme new List<string>().ToImmutableList()
. Comment dire à AutoFixture de le peupler?Comment forcer AutoFixture à créer ImmutableList
1
A
Répondre
0
Ainsi, grâce à Seemann @ Mark Je peux maintenant répondre à ma 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);
}
}
et utilisation:
var fixture = new Fixture();
fixture.Customizations.Add(new ImmutableListSpecimenBuilder());
var result = fixture.Create<ImmutableList<int>>();
0
Quelque chose comme
fixture.Register((List<string> l) => l.ToImmutableList());
devrait le faire.
fonctionne très bien pour la chaîne! Est-ce un moyen de le rendre générique pour tous les types? – user963935
@ user963935 C'est un peu plus complexe, mais vous devriez être capable d'écrire un 'ISpecimenBuilder' comme [ListRelay] (https://github.com/AutoFixture/AutoFixture/blob/master/Src/AutoFixture/Kernel/ListRelay.cs). –