2016-05-13 15 views
4

Ich versuchte, ein SortedList<,> mit AutoFixture zu schaffen, aber es schafft eine leere Liste:Wie erstelle ich eine SortedList <TKey, TValue> mit AutoFixture

var list = fixture.Create<SortedList<int, string>>(); 

Ich habe mit der folgenden kommen, welche Elemente erzeugt, aber klobig ist ein wenig:

fixture.Register<SortedList<int, string>>(
() => new SortedList<int, string>(
    fixture.CreateMany<KeyValuePair<int,string>>().ToDictionary(x => x.Key, x => x.Value))); 

Es ist nicht generisch (stark typisierte zu int und string). Ich habe zwei verschiedene TValueSortedLists zu erstellen.

Haben Sie bessere Vorschläge?

Antwort

6

Dies sieht aus wie eine Funktion AutoFixture sollte out of the Box haben, so habe ich an issue for that hinzugefügt.

Bis dahin können Sie jedoch Folgendes tun.

Erstellen Sie zunächst ein ISpecimenBuilder:

public class SortedListRelay : ISpecimenBuilder 
{ 
    public object Create(object request, ISpecimenContext context) 
    { 
     var t = request as Type; 
     if (t == null || 
      !t.IsGenericType || 
      t.GetGenericTypeDefinition() != typeof(SortedList<,>)) 
      return new NoSpecimen(); 

     var dictionaryType = typeof(IDictionary<,>) 
      .MakeGenericType(t.GetGenericArguments()); 
     var dict = context.Resolve(dictionaryType); 
     return t 
      .GetConstructor(new[] { dictionaryType }) 
      .Invoke(new[] { dict }); 
    } 
} 

Diese Implementierung nur ein Proof of Concept ist. Es fehlt an verschiedenen Stellen eine korrekte Fehlerbehandlung, aber es sollte den Ansatz demonstrieren. Es löst eine IDictionary<TKey, TValue> aus der context und verwendet den zurückgegebenen Wert (der ausgefüllt wird), um eine Instanz von SortedList<TKey, TValue> zu erstellen.

Um es zu benutzen, werden Sie AutoFixture davon erzählen müssen:

var fixture = new Fixture(); 
fixture.Customizations.Add(new SortedListRelay()); 

var actual = fixture.Create<SortedList<int, string>>(); 

Assert.NotEmpty(actual); 

Dieser Test besteht.