2017-07-14 5 views
1

System.Collections.Genericには非常に便利なImmutableListがあります。しかし、このタイプのAutofixtureはpublicコンストラクタを持たないため例外をスローしています。それはnew List<string>().ToImmutableList()のように作成されています。 AutoFixtureに入力する方法を教えてください。AutoFixtureにImmutableListを強制的に作成する方法

fixture.Register((List<string> l) => l.ToImmutableList()); 

よう

答えて

0

私は今、私の質問に答えることができます@マークシーマンのおかげだから:

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); 
    } 
} 

と使用方法:

var fixture = new Fixture(); 
fixture.Customizations.Add(new ImmutableListSpecimenBuilder()); 
var result = fixture.Create<ImmutableList<int>>(); 
文字列のための素晴らしい作品
0

何かがそれを行うべきです。

+0

を!すべてのタイプに対して汎用性を持たせる方法はありますか? – user963935

+1

@ user963935もう少し複雑ですが、[ListRelay](https://github.com/AutoFixture/blob/master/Src/AutoFixture/Kernel/ListRelay.cs)のような 'ISpecimenBuilder'を書くことができます。 )。 –

関連する問題