Autofixture: рдЕрдиреБрд░реЛрдз: IFixture рдореЗрдВ рдХреНрд▓реЛрди рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ

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

рдкрд░рд┐рдЪрдп

рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ IFixture рдореЗрдВ Clone рд╡рд┐рдзрд┐ рдпрд╛ рд╕реНрдерд┐рд░рддрд╛ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рд╣реЛред

рдлрд┐рд▓рд╣рд╛рд▓ рдореИрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ:

public static IFixture Clone( this IFixture fixture)
{
   var cloneFixture = new Fixture();

   cloneFixture.Behaviors.Clear();
   foreach ( var behavior in fixture.Behaviors)
   {
      cloneFixture.Behaviors.Add( behavior );
   }

   cloneFixture.Customizations.Clear();
   foreach ( var customization in fixture.Customizations )
   {
      cloneFixture.Customizations.Add( customization );
   }

   cloneFixture.OmitAutoProperties = fixture.OmitAutoProperties;
   cloneFixture.RepeatCount = fixture.RepeatCount;

   cloneFixture.ResidueCollectors.Clear();
   foreach ( var residueCollector in fixture.ResidueCollectors )
   {
      cloneFixture.ResidueCollectors.Add( residueCollector );
   }

   return cloneFixture;
}

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЙрдкреА рдмрдирд╛рдиреЗ рдХреА рдРрд╕реА рдХреНрд╖рдорддрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рд╡рд┐рд╡рд░рдг

рдореЗрд░рд╛ рдкрд░рд┐рджреГрд╢реНрдп рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдмрд╣реБрдд рд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рди рд╣реЛ рдФрд░ рдПрдХ рдЕрд▓рдЧ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╡реИрд▓реНрдпреВ рд╣реЛред рдореИрдВ рдЗрд╕реЗ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ; рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВ рдЗрд╕реЗ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ:

fixture.Customizations.Add( new FilteringSpecimenBuilder(
            new FixedBuilder( mediaId ),
            new ParameterSpecification( 
                typeof( ObjectId ), 
                "mediaId" ) ) );
var mediaVM = fixture.Build<MediaViewModel>()   
                     .With( mvm => mvm.ParentMixerId, mixerId )
                     .With( mvm => mvm.TrackId, trackId )
                     .Create();

_ = fixture.Customizations.Remove( fixture.Customizations.Last() );

//...

рдЕрдиреБрдХреВрд▓рди рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдпрд╣ рд╕реЛрдЪреЗ рдмрд┐рдирд╛ рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рд╢рд╛рдпрдж рдЬреЛрдбрд╝реЗ рдЧрдП рдЕрдВрддрд┐рдо рдЕрдиреБрдХреВрд▓рди рдХреА рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛; рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рдерд╛ред

рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ:

public static IFixture AddCustomization<T>( this IFixture fixture, T value, string name )
{
   fixture.Customizations.Add( new FilteringSpecimenBuilder(
         new FixedBuilder( value ),
         new ParameterSpecification(
            typeof( T ),
            name ) ) );
   return fixture;
}

рдпрд╣ рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рджреВрд╕рд░реЛрдВ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╕реНрддреБ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж рд╕реНрдерд┐рд░рддрд╛ рдореЗрдВ рдПрдХ рдЕрдиреБрдХреВрд▓рди рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЕрдм рдЗрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЗрд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореИрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдиреБрдХреВрд▓рди рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдВрдХреНрддрд┐ рдирд╣реАрдВ рд░рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред рддреЛ рдЕрдЧрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореЗрд░реА рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рдиреЗ рдореЗрд░реА рд╕реНрдерд┐рд░рддрд╛ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рдИ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рддреЛ рдореЗрд░реА рд░рдЪрдирд╛рдПрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ рдФрд░ рдореВрд▓ рд╕реНрдерд┐рд░рддрд╛ рдЫреВрдЯреА рд╣реБрдИ рд╣реИред

рдПрдХ рдЕрдиреБрдХреВрд▓рди рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреА рдХрд╛рдо рдХрд░реЗрдЧреА рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирдиреЗ рдХреЗ рдмрд╛рдж рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИред

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж: рд╕реНрдорд╛рдЗрд▓реА:

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

@ajorians рдореИрдВ рдирд┐рд╖реНрдХреНрд░рд┐рдпрддрд╛ рдХреЗ рдХрд╛рд░рдг рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ рд▓реЗрдХрд┐рди рдореИрдВ рдЙрд╕ рд╡рд┐рд╢рд╛рд▓ рдирд┐рд░реНрдорд╛рддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдЪрд▓ рд╕рдХрд╛ред
рдореБрдЭреЗ рдкреВрдЫрдирд╛ рд╣реИ, рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЕрдкрдирд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдмрджрд▓рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ?

рдЖрдкрдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рджреЗрдЦрдХрд░ рдореИрдВ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрдИ рдореБрджреНрджреЛрдВ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдБред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдк рдирдИ рдФрд░ рдЗрдВрдЬреЗрдХреНрд╢рди рдпреЛрдЧреНрдп рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдорд┐рд▓рд╛ рд░рд╣реЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрдкрд╛рдп рдпрд╣ рд╣реИ рдХрд┐ рдЕрдкрдиреА рдЗрдВрдЬреЗрдХреНрд╢рди рдпреЛрдЧреНрдп рдирд┐рд░реНрднрд░рддрд╛ (рдЙрд░реНрдл рд╕рд░реНрд╡рд┐рд╕ рдЗрдВрдЯрд░рдлреЗрд╕) рдХреЛ рдЧреБрдгреЛрдВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рд╕рдВрдкрддреНрддрд┐ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВред
рдпрд╣ Fixture рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрдкрдХреА рддрддреНрдХрд╛рд▓ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдЧрд╛ рдФрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдЕрдзрд┐рдХ рдкреНрд░рдмрдВрдзрдиреАрдп рдмрдирд╛ рджреЗрдЧрд╛ред

рджреВрд╕рд░рд╛ рдУрд╡рд░-рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЛрдб рдЧрдВрдз рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдореВрд░реНрдд рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ред
рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ SRP рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдпрд╣ рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЗрд╕ рд╕рдордп рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реЗрдЯрдЕрдк рдХреА рднрд╛рд░реА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░ рджреЗрдЧрд╛ред

рдЪреВрдВрдХрд┐ рдХрдХреНрд╖рд╛ рдХреЛ ViewModel рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдПрдорд╡реАрд╡реАрдПрдо рдПрдкреНрд▓реАрдХреЗрд╢рди рд╣реИред рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдореИрд╕реЗрдЬрд┐рдВрдЧ рдореЙрдбрд▓ рдкреЗрд╢ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдФрд░ рднреА рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдПрдХ рдЗрд╡реЗрдВрдЯ рдПрдЧреНрд░реАрдЧреЗрдЯрд░ред рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрдорд╡реАрд╡реАрдПрдо рдврд╛рдВрдЪреЗ рдиреЗ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдкрдХреЛ рдЙрдирд╕реЗ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реЗрдЯрдЕрдк рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред

рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдорджрдж рдорд┐рд▓рддреА рд╣реИред

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

@ajorians рд╢реБрдн рджрд┐рди! рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдХреИрд╕реЗ рд╕рдордЭрд╛, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╣ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдПред рд╕реНрдерд┐рд░рддрд╛ рдХреА Build() рд╡рд┐рдзрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдЧреНрд░рд╛рдлрд╝ рдХреА рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛ рд░рд╣реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк "рд╡рди рдЯрд╛рдЗрдо" рдЕрдиреБрдХреВрд▓рди рдХреЛ рдмрд┐рдирд╛ рдмрдирд╛рдП рд░рдЦреЗ AutoFixture рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рдбреЗрдореЛ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ:

```рд╕реА#
рдкрдмреНрд▓рд┐рдХ рдХреНрд▓рд╛рд╕ рдореЙрдбрд▓
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрдЯ рдЖрдИрдбреА {рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ; рд╕реЗрдЯ; }
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд╛рдо {рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ; рд╕реЗрдЯ; }
}

[рддрдереНрдп]
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╢реВрдиреНрдп рдбреЗрдореЛ ()
{
рд╡рд░ рд╕реНрдерд┐рд░рддрд╛ = рдирдИ рд╕реНрдерд┐рд░рддрд╛ ();
рд╕реНрдерд┐рд░рддрд╛ред рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ(рд╕реА => рд╕реА.рд╡рд┐рде (рдПрдо => рдПрдо.рдЖрдИрдбреА, 42));

var value1 = fixture.Create<Model>();
Assert.Equal(42, value1.Id);
Assert.NotNull(value1.Name);

var value2 = fixture.Build<Model>()
    .With(m => m.Id, (int genInt) => genInt * 2 /* make it always even */)
    .Without(x => x.Name)
    .Create();
Assert.NotEqual(42, value2.Id);
Assert.Equal(value2.Id % 2, 0);
Assert.Null(value2.Name);

var value3 = fixture.Create<Model>();
Assert.Equal(42, value3.Id);
Assert.NotNull(value3.Name);

}
```

рд╣рдореЗрдВ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдХреГрдкрдпрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрди рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдорджрдж рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдзрдиреНрдпрд╡рд╛рдж!

рд╣рд╛рдп @zvirja ,

рд╢реБрдн рджрд┐рд╡рд╕!

рдЕрдЧрд░ рдореИрдВ рдХрд░ рд╕рдХреВрдВ; рд╣рдорд╛рд░реЗ Model рд╡рд░реНрдЧ рдореЗрдВ set рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рддреЛ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ:

public class Model
{
   public Model( int id, string name )
   {
      Id = id;
      Name = name;
   }

   public int Id { get; }
   public string Name { get; }
}

рдореВрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред

рдЗрд╕рд▓рд┐рдП рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдпреЗ рдЕрдиреБрдХреВрд▓рди Build() ред

рдЕрдЧрд░ рдХреБрдЫ рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рддреЛ рд╣рдо рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрд┐рдирд╛ рд╕реЗрдЯрд░реНрд╕ рдХреЗ рдЗрд╕рд▓рд┐рдП рд╣рдо readonly рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рджрд╕реНрдп рдЪрд░ рд╕реЗрдЯ рд╣реИрдВ рдФрд░ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд╕рдордп рддрдХ рдЕрдирд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдмреБрд▓рд╛рдпрд╛ред

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! :рд╕реНрдорд╛рдЗрд▓реА:

@ajorians рдХреНрдпрд╛ рдореИрдВ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЗрдирдкреБрдЯ рддрд░реНрдХ рд╡рд╛рд▓рд╛ рдореЙрдбрд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЪрд┐рдВрддрд╛ рдХрд┐рдП рдмрд┐рдирд╛, рдЗрд╕рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╕рд╣реА?

рдЕрдиреНрдпрдерд╛, рдЖрдк рд╣рдореЗрд╢рд╛ рдХреБрдЫ рдРрд╕рд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддреЗ рд╣реИрдВ
c# var value2 = fixture.Build<Model>() .FromFactory((int id, string name) => new Model(id, name)) .Create();

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдмрдврд╝рддреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкреИрдорд╛рдирд╛ рдирд╣реАрдВ рд╣реИ

@ajorians рдХреНрдпрд╛ рдореИрдВ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЗрдирдкреБрдЯ рддрд░реНрдХ рд╡рд╛рд▓рд╛ рдореЙрдбрд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЪрд┐рдВрддрд╛ рдХрд┐рдП рдмрд┐рдирд╛, рдЗрд╕рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╕рд╣реА?

рд╣рд╛рдБ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рд╣реИред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдмрдврд╝рддреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкреИрдорд╛рдирд╛ рдирд╣реАрдВ рд╣реИ

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ Freeze рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдмрдврд╝рддреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдХрдИ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рд╛рдБ, рдЬрд┐рд╕ рд╡рд░реНрдЧ рдХреЛ рдореИрдВ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рдерд╛, рдЬрд╣рд╛рдБ рдореИрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ 30 рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ:
image

рдФрд░ рд╕рдВрднрд╡рдд: рдЗрд╕ рд╡рд░реНрд╖ рдХреЗ рдЕрдВрдд рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд 4 рдпрд╛ рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХреА рд╡реГрджреНрдзрд┐ рд╣реЛрдЧреАред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рд╣рд╛рдВ рдореЗрд░реЗ рдкрд╛рд╕ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдмрдврд╝рддреЗ рдЗрдирдкреБрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рддрд░реНрдХ рд╣реИрдВ рдФрд░ рдореИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдмрд╛рдХреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗ рдмрд┐рдирд╛ рдЙрдирдореЗрдВ рд╕реЗ рд╕рд┐рд░реНрдл рдПрдХ (рдпрд╛ рдХреБрдЫ) рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдкреВрд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдпрд╛ рдлреНрд░реАрдЬ рдХрд┐рдП рдмрд┐рдирд╛ред рдФрд░ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рддрд░реАрдХреЗ рд╕реЗ рдЕрдиреБрдХреВрд▓рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдб рдХреА рд▓рдЧрднрдЧ 5 рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реИрдВред

рдореИрдВ рд╕реМрднрд╛рдЧреНрдп рд╕реЗ рд╡рд╣ рд╕рдм рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдБ; рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдХреЛрдб рдореЗрдВ clone рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐ рдмрдирд╛рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдерд╛ред

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЗрд╕реЗ рдореЗрд░реЗ рд╕рд╛рде рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж: рд╕реНрдорд╛рдЗрд▓реА:

@ajorians рдореИрдВ рдирд┐рд╖реНрдХреНрд░рд┐рдпрддрд╛ рдХреЗ рдХрд╛рд░рдг рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ рд▓реЗрдХрд┐рди рдореИрдВ рдЙрд╕ рд╡рд┐рд╢рд╛рд▓ рдирд┐рд░реНрдорд╛рддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдЪрд▓ рд╕рдХрд╛ред
рдореБрдЭреЗ рдкреВрдЫрдирд╛ рд╣реИ, рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЕрдкрдирд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдмрджрд▓рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ?

рдЖрдкрдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рджреЗрдЦрдХрд░ рдореИрдВ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрдИ рдореБрджреНрджреЛрдВ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдБред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдк рдирдИ рдФрд░ рдЗрдВрдЬреЗрдХреНрд╢рди рдпреЛрдЧреНрдп рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдорд┐рд▓рд╛ рд░рд╣реЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрдкрд╛рдп рдпрд╣ рд╣реИ рдХрд┐ рдЕрдкрдиреА рдЗрдВрдЬреЗрдХреНрд╢рди рдпреЛрдЧреНрдп рдирд┐рд░реНрднрд░рддрд╛ (рдЙрд░реНрдл рд╕рд░реНрд╡рд┐рд╕ рдЗрдВрдЯрд░рдлреЗрд╕) рдХреЛ рдЧреБрдгреЛрдВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рд╕рдВрдкрддреНрддрд┐ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВред
рдпрд╣ Fixture рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрдкрдХреА рддрддреНрдХрд╛рд▓ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдЧрд╛ рдФрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдЕрдзрд┐рдХ рдкреНрд░рдмрдВрдзрдиреАрдп рдмрдирд╛ рджреЗрдЧрд╛ред

рджреВрд╕рд░рд╛ рдУрд╡рд░-рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЛрдб рдЧрдВрдз рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдореВрд░реНрдд рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ред
рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ SRP рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдпрд╣ рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЗрд╕ рд╕рдордп рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реЗрдЯрдЕрдк рдХреА рднрд╛рд░реА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░ рджреЗрдЧрд╛ред

рдЪреВрдВрдХрд┐ рдХрдХреНрд╖рд╛ рдХреЛ ViewModel рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдПрдорд╡реАрд╡реАрдПрдо рдПрдкреНрд▓реАрдХреЗрд╢рди рд╣реИред рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдореИрд╕реЗрдЬрд┐рдВрдЧ рдореЙрдбрд▓ рдкреЗрд╢ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдФрд░ рднреА рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдПрдХ рдЗрд╡реЗрдВрдЯ рдПрдЧреНрд░реАрдЧреЗрдЯрд░ред рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрдорд╡реАрд╡реАрдПрдо рдврд╛рдВрдЪреЗ рдиреЗ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдкрдХреЛ рдЙрдирд╕реЗ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реЗрдЯрдЕрдк рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред

рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдорджрдж рдорд┐рд▓рддреА рд╣реИред

рд╣рд╛рдп @aivascu ,

@ajorians рдореИрдВ рдирд┐рд╖реНрдХреНрд░рд┐рдпрддрд╛ рдХреЗ рдХрд╛рд░рдг рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛

рдЕрдЧрд░ рдХреБрдЫ рд╣реИ рддреЛ рдореИрдВ рдмрд╕ рдореБрдЭреЗ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВред рдПрдХ рдлреАрдЪрд░ рдЕрдиреБрд░реЛрдз рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рддрдХ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдЗрд╕рдореЗрдВ рдХрд╛рдлреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдирд┐рд╖реНрдХреНрд░рд┐рдпрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдореБрдЭреЗ рдкреВрдЫрдирд╛ рд╣реИ, рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЕрдкрдирд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдмрджрд▓рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ?

рдлрд┐рд▓рд╣рд╛рд▓ рд╣рдо рдкреНрд░рд┐рдЬреНрдо рдПрдкреНрд▓реАрдХреЗрд╢рди рдмрдирдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред рд▓реЗрдХрд┐рди рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдореИрдВ рд╣рдореЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╕рдм рдХреБрдЫ рдбрд╛рд▓рдиреЗ рдХреЗ рджрд░реНрд╢рди рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдП рдирд╣реАрдВ рджреЗрдЦрддрд╛, рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕реЗ null рдПрдХ рдмрд╛рд░ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ readonly рдФрд░ рд╣рдореЗрд╢рд╛ рдЧреИрд░- null рдХрдХреНрд╖рд╛ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред рд╣рдореЗрдВ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрдЧрд▓реЗ рдПрдХ рд╕рд╛рд▓ рдореЗрдВ рдЗрд╕рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред

рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдорджрдж рдорд┐рд▓рддреА рд╣реИред

рдпрд╣ рд╕рдм рдорджрдж рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЯреАрдо рдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рджреБрдирд┐рдпрд╛ рдХреЗ рд▓реЛрдЧ рднреА рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдкреВрдЫ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ IFixture рд▓рд┐рдП Clone рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХреА рд╡рд┐рдзрд┐ рд╣реЛрдирд╛ рдЙрдЪрд┐рдд рд╣реИ? рдпрд╛ рдХрд┐рд╕реА рддрд░рд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рдПрдХ рдЕрдиреБрдХреВрд▓рди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ рдФрд░ рдлрд┐рд░ pop рдЕрдВрддрд┐рдо рдЬреЛрдбрд╝рд╛ рдЕрдиреБрдХреВрд▓рди рдмрдВрдж рдХрд░реЗрдВ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреБрдХреВрд▓рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рддрд░рд╣ рд░рд╛рдЬреНрдп рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрдПрдВ? рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЗрд╕ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рддрдХ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рди рд╣реЛ, рддрдм рддрдХ рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрдЯрд┐рд▓рддрд╛ рдирд╣реАрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдареАрдХ рд╣реИ рдЖрдк рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред

рдкрдврд╝рдиреЗ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж :рд╕реНрдорд╛рдЗрд▓реА:

@ajorians рдореЗрд░реА рд░рд╛рдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ .Clone() рд╡рд┐рдзрд┐ рдХреЛ Fixture рд╡рд░реНрдЧ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХрд┐рд╕реА рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╕рдордп рдХреЗрд╡рд▓ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕реНрдерд┐рд░рддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдЕрддреАрдд рдореЗрдВ рдПрдХ рдмрд╛рд░ рдЕрдирдлреНрд░реАрдЬ/рдЗрдЬреЗрдХреНрдЯ/рдлреНрд░реАрдЬ-рд╡рдиреНрд╕ рдлреАрдЪрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдиреБрд░реЛрдз рдХрд┐рдП рдЧрдП рд╣реИрдВ рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХреЛ рднреА рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдпрд╣ рдкрд╣рдЪрд╛рдирдиреЗ рдХрд╛ рдХреЛрдИ рдорд╛рдореВрд▓реА рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдирд┐рд░реНрдорд╛рддрд╛ рдЬрдореЗ рд╣реБрдП рдореВрд▓реНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдЖрдЦрд┐рд░реА рдЗрдВрдЬреЗрдХреНрд╢рди рдореВрд▓реНрдп рдХреНрдпрд╛ рдерд╛ред

рдЖрдк рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдПрдХ рд░рд┐рд▓реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдЬреЛ рд╕рдлрд▓ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЧрдгрдирд╛ рдХреЗ рдмрд╛рдж рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдиреАрдЪреЗред рдЖрдк рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЕрдкрдбреЗрдЯ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╛рдХреА рдХреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдореВрд▓ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЕрдиреБрдХреВрд▓рди рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

public class CountingRelay : ISpecimenBuilder
{
    public CountingRelay(ISpecimenBuilder builder, int maxCount)
    {
        this.MaxCount = maxCount;
        this.Builder = builder;
    }

    public int Count { get; private set; }
    public int MaxCount { get; }
    public ISpecimenBuilder Builder { get; }

    public object Create(object request, ISpecimenContext context)
    {
        if (this.Count == this.MaxCount) return new NoSpecimen();
        var result = this.Builder.Create(request, context);
        if (!(result is NoSpecimen)) this.Count++;
        return result;
    }
}

рд╣рд╛рдп @aivascu ,

@ajorians рдореЗрд░реА рд░рд╛рдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ .Clone() рд╡рд┐рдзрд┐ рдХреЛ Fixture рд╡рд░реНрдЧ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдареАрдХ рд╣реИред рдЦреИрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдЖрдк рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдПрдХ рд░рд┐рд▓реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЬреЛ рд╕рдлрд▓ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЧрдгрдирд╛ рдХреЗ рдмрд╛рдж рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ

рдореИрдВ рдПрдХ рдирдЬрд░ рдорд╛рд░ рд▓реВрдЧрд╛рдВред

рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзрдиреНрдпрд╡рд╛рдж! :рд╕реНрдорд╛рдЗрд▓реА:

@ajorians рдореИрдВрдиреЗ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрдХреВрд▓рди рд░реАрд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рдФрдкрдЪрд╛рд░рд┐рдХ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз #1214 рдмрдирд╛рдпрд╛ рд╣реИред рдЖрдк рд╡рд╣рд╛рдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдкреНрд░рдЧрддрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

malylemire1 picture malylemire1  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zvirja picture zvirja  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Accc99 picture Accc99  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mjfreelancing picture mjfreelancing  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zvirja picture zvirja  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ