рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ 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 рд╢реБрдн рджрд┐рди! рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдХреИрд╕реЗ рд╕рдордЭрд╛, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╣ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдПред рд╕реНрдерд┐рд░рддрд╛ рдХреА Build()
рд╡рд┐рдзрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдЧреНрд░рд╛рдлрд╝ рдХреА рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛ рд░рд╣реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк "рд╡рди рдЯрд╛рдЗрдо" рдЕрдиреБрдХреВрд▓рди рдХреЛ рдмрд┐рдирд╛ рдмрдирд╛рдП рд░рдЦреЗ AutoFixture рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рдбреЗрдореЛ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ:
```рд╕реА#
рдкрдмреНрд▓рд┐рдХ рдХреНрд▓рд╛рд╕ рдореЙрдбрд▓
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрдЯ рдЖрдИрдбреА {рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ; рд╕реЗрдЯ; }
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд╛рдо {рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ; рд╕реЗрдЯ; }
}
[рддрдереНрдп]
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╢реВрдиреНрдп рдбреЗрдореЛ ()
{
рд╡рд░ рд╕реНрдерд┐рд░рддрд╛ = рдирдИ рд╕реНрдерд┐рд░рддрд╛ ();
рд╕реНрдерд┐рд░рддрд╛ред рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ
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
рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ:
рдФрд░ рд╕рдВрднрд╡рдд: рдЗрд╕ рд╡рд░реНрд╖ рдХреЗ рдЕрдВрдд рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд 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 рдмрдирд╛рдпрд╛ рд╣реИред рдЖрдк рд╡рд╣рд╛рдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдкреНрд░рдЧрддрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
@ajorians рдореИрдВ рдирд┐рд╖реНрдХреНрд░рд┐рдпрддрд╛ рдХреЗ рдХрд╛рд░рдг рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ рд▓реЗрдХрд┐рди рдореИрдВ рдЙрд╕ рд╡рд┐рд╢рд╛рд▓ рдирд┐рд░реНрдорд╛рддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдЪрд▓ рд╕рдХрд╛ред
рдореБрдЭреЗ рдкреВрдЫрдирд╛ рд╣реИ, рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЕрдкрдирд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдмрджрд▓рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ?
рдЖрдкрдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рджреЗрдЦрдХрд░ рдореИрдВ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрдИ рдореБрджреНрджреЛрдВ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдБред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдк рдирдИ рдФрд░ рдЗрдВрдЬреЗрдХреНрд╢рди рдпреЛрдЧреНрдп рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдорд┐рд▓рд╛ рд░рд╣реЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрдкрд╛рдп рдпрд╣ рд╣реИ рдХрд┐ рдЕрдкрдиреА рдЗрдВрдЬреЗрдХреНрд╢рди рдпреЛрдЧреНрдп рдирд┐рд░реНрднрд░рддрд╛ (рдЙрд░реНрдл рд╕рд░реНрд╡рд┐рд╕ рдЗрдВрдЯрд░рдлреЗрд╕) рдХреЛ рдЧреБрдгреЛрдВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рд╕рдВрдкрддреНрддрд┐ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВред
рдпрд╣
Fixture
рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрдкрдХреА рддрддреНрдХрд╛рд▓ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдЧрд╛ рдФрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдЕрдзрд┐рдХ рдкреНрд░рдмрдВрдзрдиреАрдп рдмрдирд╛ рджреЗрдЧрд╛редрджреВрд╕рд░рд╛ рдУрд╡рд░-рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЛрдб рдЧрдВрдз рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдореВрд░реНрдд рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ред
рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ SRP рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдпрд╣ рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЗрд╕ рд╕рдордп рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реЗрдЯрдЕрдк рдХреА рднрд╛рд░реА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░ рджреЗрдЧрд╛ред
рдЪреВрдВрдХрд┐ рдХрдХреНрд╖рд╛ рдХреЛ
ViewModel
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдПрдорд╡реАрд╡реАрдПрдо рдПрдкреНрд▓реАрдХреЗрд╢рди рд╣реИред рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдореИрд╕реЗрдЬрд┐рдВрдЧ рдореЙрдбрд▓ рдкреЗрд╢ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдФрд░ рднреА рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдПрдХ рдЗрд╡реЗрдВрдЯ рдПрдЧреНрд░реАрдЧреЗрдЯрд░ред рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрдорд╡реАрд╡реАрдПрдо рдврд╛рдВрдЪреЗ рдиреЗ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдкрдХреЛ рдЙрдирд╕реЗ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реЗрдЯрдЕрдк рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛредрдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдорджрдж рдорд┐рд▓рддреА рд╣реИред