2017-07-14 3 views
1

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

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.

+0

fonctionne très bien pour la chaîne! Est-ce un moyen de le rendre générique pour tous les types? – user963935

+1

@ 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). –