Autofixture: ConcurrentDictionary

Erstellt am 24. Apr. 2020  ·  6Kommentare  ·  Quelle: AutoFixture/AutoFixture

Hallo,
Wenn ich Autofixture verwende, um ein Dictionary<T, U> zu generieren, werden standardmäßig Werte darin eingetragen, bei einem ConcurrentDictionary<T, U> jedoch nicht.

Ist dies beabsichtigt und ich sollte einen Musterbauer verwenden, um dieses Verhalten selbst zu ändern, oder handelt es sich um eine fehlende Funktion oder einen Fehler?

Hilfreichster Kommentar

Hallo,
Ich kann die Gründe dafür nicht sagen, aber wenn ich mir den Quellcode ansehe, sind die unterstützten Sammlungen fest codiert.
Es ist also nicht so etwas wie "Typ implementiert IDictionary", sondern "ist Typ Dictionary<,>". Daher funktioniert ConcurrentDictionary nicht.
Sie müssen keinen eigenen Musterbauer erstellen, Sie können das verwenden, was bereits vorhanden ist:

      var fixture = new Fixture();

      var query = new ModestConstructorQuery();
      var methodInvoker = new MethodInvoker(query);
      var dictionaryFiller = new DictionaryFiller();
      var postProcessor = new Postprocessor(methodInvoker, dictionaryFiller);
      var exactTypeSpecification = new ExactTypeSpecification(typeof(ConcurrentDictionary<,>));
      var specimenBuilder = new FilteringSpecimenBuilder(postProcessor, exactTypeSpecification);

      fixture.Customizations.Add(specimenBuilder);

Alle 6 Kommentare

Wenn jemand anderes auf das gleiche Problem stößt, habe ich dafür einen Musterbauer geschrieben:

public class ConcurrentDictionaryGenerator : ISpecimenBuilder
{
    public object Create(object request, ISpecimenContext context)
    {
        Type type = request as Type;
        if (type == null)
        {
            return new NoSpecimen();
        }

        Type[] typeArguments = type.GetTypeInfo().GetGenericArguments();
        if (typeArguments.Length != 2 || typeof(ConcurrentDictionary<,>).MakeGenericType(typeArguments) != type)
        {
            return new NoSpecimen();
        }

        Type nonConcurrentDictionaryType = typeof(Dictionary<,>).MakeGenericType(typeArguments);
        IDictionary nonConcurrentDictionary = (IDictionary) context.Resolve(nonConcurrentDictionaryType);

        IDictionary concurrentDictionary = (IDictionary) Activator.CreateInstance(type);

        foreach (object key in nonConcurrentDictionary.Keys)
        {
            object value = nonConcurrentDictionary[key];
            concurrentDictionary.Add(key, value);
        }

        return concurrentDictionary;
    }
}

Hallo,
Ich kann die Gründe dafür nicht sagen, aber wenn ich mir den Quellcode ansehe, sind die unterstützten Sammlungen fest codiert.
Es ist also nicht so etwas wie "Typ implementiert IDictionary", sondern "ist Typ Dictionary<,>". Daher funktioniert ConcurrentDictionary nicht.
Sie müssen keinen eigenen Musterbauer erstellen, Sie können das verwenden, was bereits vorhanden ist:

      var fixture = new Fixture();

      var query = new ModestConstructorQuery();
      var methodInvoker = new MethodInvoker(query);
      var dictionaryFiller = new DictionaryFiller();
      var postProcessor = new Postprocessor(methodInvoker, dictionaryFiller);
      var exactTypeSpecification = new ExactTypeSpecification(typeof(ConcurrentDictionary<,>));
      var specimenBuilder = new FilteringSpecimenBuilder(postProcessor, exactTypeSpecification);

      fixture.Customizations.Add(specimenBuilder);

Je mehr ich über die Interna dieser Bibliothek lerne, desto mehr liebe ich sie

Interessant zu wissen, dass es derzeit nur auf Dictionary<,> läuft und vielen Dank für die eingebaute Möglichkeit, dies zu tun!

Ich denke, die einzige verbleibende Frage für jemanden wäre dann: Wäre dies eine gute Funktion zum Hinzufügen? Vielleicht nicht speziell für ConcurrentDictionary<,> , aber für alle IDictionary<,> -Implementierungen?

Nur dass ich keine falschen Informationen verbreite, es ist nicht nur Dictionary<,>. Ich wollte nur darauf hinweisen, dass die Liste der Typen direkt in Fixture.cs zu finden ist. ZB ist es auch SortedDictionary<,>, aber wie Sie bereits herausgefunden haben, ist es nicht ConcurrentDictionary<,>.
Auf jeden Fall würde ich sagen, dass eine zukünftige Implementierung die Schnittstelle überprüfen sollte.

In Wirklichkeit ist das, was hartcodiert ist, nicht die Unterstützung, sondern die Tatsache, dass Schnittstellen an einen bestimmten Typ weitergeleitet werden. Wie IDictionary und IReadOnlyDictionary an Dictionary weitergeleitet werden und so weiter.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

zvirja picture zvirja  ·  3Kommentare

zvirja picture zvirja  ·  8Kommentare

mjfreelancing picture mjfreelancing  ·  4Kommentare

gtbuchanan picture gtbuchanan  ·  3Kommentare

ecampidoglio picture ecampidoglio  ·  7Kommentare