Autofixture: рд╕рдорд╡рд░реНрддреА рд╢рдмреНрджрдХреЛрд╢

рдХреЛ рдирд┐рд░реНрдорд┐рдд 24 рдЕрдкреНрд░реИрд▓ 2020  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: AutoFixture/AutoFixture

рдирдорд╕реНрддреЗ,
рдЬрдм рдореИрдВ Dictionary<T, U> рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдЯреЛрдлрд┐рдХреНрд╕реНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕рдореЗрдВ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд┐рдП рдЧрдП рдорд╛рди рдорд┐рд▓рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди ConcurrentDictionary<T, U> рдХреЗ рд╕рд╛рде рдореИрдВ рдирд╣реАрдВ рдХрд░рддрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕реНрд╡рдпрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдореВрдирд╛ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдпрд╣ рдПрдХ рд▓рд╛рдкрддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╛ рдмрдЧ рд╣реИ?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдирдорд╕реНрддреЗ,
рдореИрдВ рдЗрд╕рдХреЗ рдкреАрдЫреЗ рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рд╕рдорд░реНрдерд┐рдд рд╕рдВрдЧреНрд░рд╣ рд╣рд╛рд░реНрдб рдХреЛрдбрд┐рдд рд╣реИрдВред
рддреЛ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреИрд╕реЗ "рдЯрд╛рдЗрдк рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ IDictionary", рдпрд╣ "рдЯрд╛рдЗрдк рдбрд┐рдХреНрд╢рдирд░реА<,>" рд╣реИред рдЗрд╕рд▓рд┐рдП рд╕рдорд╡рд░реНрддреА рд╢рдмреНрджрдХреЛрд╢ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдирдореВрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдЪреАрдЬрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

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

рд╕рднреА 6 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЕрдЧрд░ рдХреЛрдИ рдФрд░ рдПрдХ рд╣реА рдореБрджреНрджреЗ рдкрд░ рдЖрддрд╛ рд╣реИ, рддреЛ рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдирдореВрдирд╛ рдирд┐рд░реНрдорд╛рддрд╛ рд▓рд┐рдЦрд╛ рд╣реИ:

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

рдирдорд╕реНрддреЗ,
рдореИрдВ рдЗрд╕рдХреЗ рдкреАрдЫреЗ рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рд╕рдорд░реНрдерд┐рдд рд╕рдВрдЧреНрд░рд╣ рд╣рд╛рд░реНрдб рдХреЛрдбрд┐рдд рд╣реИрдВред
рддреЛ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреИрд╕реЗ "рдЯрд╛рдЗрдк рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ IDictionary", рдпрд╣ "рдЯрд╛рдЗрдк рдбрд┐рдХреНрд╢рдирд░реА<,>" рд╣реИред рдЗрд╕рд▓рд┐рдП рд╕рдорд╡рд░реНрддреА рд╢рдмреНрджрдХреЛрд╢ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдирдореВрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдЪреАрдЬрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

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

рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдореИрдВ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЖрдВрддрд░рд┐рдХ рднрд╛рдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрддрд╛ рд╣реВрдБ, рдЙрддрдирд╛ рд╣реА рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдЖрддрд╛ рд╣реИ

рдпрд╣ рдЬрд╛рдирдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ Dictionary<,> рдкрд░ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддрд░реАрдХреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рд╢реЗрд╖ рдкреНрд░рд╢реНрди рд╣реЛрдЧрд╛: рдХреНрдпрд╛ рдпрд╣ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рд╣реЛрдЧреА? рд╢рд╛рдпрдж ConcurrentDictionary<,> рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рд╕рднреА IDictionary<,> рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП?

рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдореИрдВ рдЧрд▓рдд рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдлреИрд▓рд╛рддрд╛, рдпрд╣ рдХреЗрд╡рд▓ рдбрд┐рдХреНрд╢рдирд░реА<,> рдирд╣реАрдВ рд╣реИред рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕реВрдЪреА рд╕реАрдзреЗ Fixture.cs рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ SortedDictionary<,> рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╣реА рд╕рдордЭ рдЪреБрдХреЗ рд╣реИрдВ, рдпрд╣ ConcurrentDictionary<,> рдирд╣реАрдВ рд╣реИред
рд╣рд░ рддрд░рд╣ рд╕реЗ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

рд╣рдХреАрдХрдд рдореЗрдВ рдЬреЛ рд╣рд╛рд░реНрдбрдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ рдмрд▓реНрдХрд┐ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреБрдЫ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд░рд┐рд▓реЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЬреИрд╕реЗ IDictionary рдФрд░ IReadOnlyDictionary рдХреЛ рдбрд┐рдХреНрд╢рдирд░реА рдореЗрдВ рд░рд┐рд▓реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕