Autofixture: Kamus Serentak

Dibuat pada 24 Apr 2020  ·  6Komentar  ·  Sumber: AutoFixture/AutoFixture

Hai,
Ketika saya menggunakan autofixture untuk menghasilkan Dictionary<T, U> saya mendapatkan nilai yang terisi di dalamnya secara default, tetapi dengan ConcurrentDictionary<T, U> saya tidak.

Apakah ini dirancang & saya harus menggunakan pembuat spesimen untuk mengubah perilaku itu sendiri, atau apakah itu fitur atau bug yang hilang?

Komentar yang paling membantu

Halo,
Saya tidak dapat memberi tahu alasan di balik ini, tetapi melihat kode sumber koleksi yang didukung adalah kode keras.
Jadi ini bukan sesuatu seperti "apakah tipe implement IDictionary", ini "adalah tipe Dictionary<,>". Oleh karena itu ConcurrentDictionary tidak berfungsi.
Anda tidak perlu membuat pembuat spesimen sendiri, Anda dapat menggunakan yang sudah ada:

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

Semua 6 komentar

Jika ada orang lain yang menemukan masalah yang sama, saya telah menulis pembuat spesimen untuk ini:

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

Halo,
Saya tidak dapat memberi tahu alasan di balik ini, tetapi melihat kode sumber koleksi yang didukung adalah kode keras.
Jadi ini bukan sesuatu seperti "apakah tipe implement IDictionary", ini "adalah tipe Dictionary<,>". Oleh karena itu ConcurrentDictionary tidak berfungsi.
Anda tidak perlu membuat pembuat spesimen sendiri, Anda dapat menggunakan yang sudah ada:

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

Semakin saya belajar tentang internal perpustakaan ini, semakin saya menyukainya

Menarik untuk mengetahui bahwa ini hanya pada Dictionary<,> saat ini & terima kasih atas cara bawaan untuk melakukannya!

Saya kira satu-satunya pertanyaan yang tersisa untuk seseorang adalah: apakah ini fitur yang bagus untuk ditambahkan? Mungkin bukan untuk ConcurrentDictionary<,> secara khusus, tetapi semua implementasi IDictionary<,> ?

Hanya saja saya tidak menyebarkan informasi yang salah, ini bukan hanya Kamus<,>. Saya hanya ingin menunjukkan bahwa daftar tipe dapat ditemukan langsung di Fixture.cs. Misalnya ini juga SortedDictionary<,>, tetapi seperti yang sudah Anda ketahui, itu bukan ConcurrentDictionary<,>.
Dengan segala cara saya akan mengatakan bahwa implementasi di masa depan harus memeriksa antarmuka.

Pada kenyataannya apa yang di-hardcode bukanlah dukungannya, melainkan fakta bahwa antarmuka diteruskan ke beberapa tipe konkret. Seperti IDictionary dan IReadOnlyDictionary diteruskan ke Dictionary, dan seterusnya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat