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์ Build()
๋ฉ์๋๋ ์ค์ ๋ก ๋ด๋ถ ๊ทธ๋ํ์ ๋ณ๊ฒฝํ ์ ์๋ ๋ณต์ฌ๋ณธ์ ์์ฑํ๋ฏ๋ก ์ ์งํ์ง ์๊ณ AutoFixture ์์ "์ผํ์ฑ" ์ฌ์ฉ์ ์ ์๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
์ด ํ๋ ์ด๊ทธ๋ผ์ด๋ ๋ฐ๋ชจ๋ฅผ ๊ฒํ ํ์ธ์:
```c#
๊ณต๊ฐ ํด๋์ค ๋ชจ๋ธ
{
๊ณต๊ฐ ์ ์ ID { ๊ฐ์ ธ์ค๊ธฐ; ์ธํธ; }
๊ณต๊ฐ ๋ฌธ์์ด ์ด๋ฆ { get; ์ธํธ; }
}
[์ฌ์ค]
๊ณต๊ฐ ๋ฌดํจ ๋ฐ๋ชจ()
{
var ๊ณ ์ ์ฅ์น = new Fixture();
์ ์ฐฉ๋ฌผ.์ฌ์ฉ์ ์ ์
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()
์
๋๋ค.
๊ด์ฌ์ด ์๋ค๋ฉด ์์ฑ์์์ ๋ง์ ์ผ์ ํ๊ณ setter ์์ด๋ readonly
ํค์๋๋ฅผ ์ฌ์ฉํ๊ณ ๋ฉค๋ฒ ๋ณ์๊ฐ ์ค์ ๋๊ณ ๋ฉ์๋๊ฐ ์ค์ ๋ ๋๊น์ง ์ค์ ํด์ ๋ ์ ์๋๋ก ํ๊ธฐ ์ํ ๊ฒ์
๋๋ค. ๋ผ๊ณ ๋ถ๋ฆฌ๋.
๋ ๋์ ์๋ฏธ๊ฐ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋์์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! :์ค๋ง์ผ๋ฆฌ:
@ajorians ๋ง์ ์์ ์ ๋ ฅ ์ธ์๊ฐ ์๋ ๋ชจ๋ธ์ด ์์ผ๋ฏ๋ก ๋ช ์์ ์ผ๋ก ๊ฑฑ์ ํ ํ์ ์์ด ๊ทธ ์ค ํ๋๋ง ์ฌ์ฉ์ ์ง์ ํ๋ ค๋ ๋ฌธ์ ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๊ณ
๊ทธ๋ ์ง ์์ผ๋ฉด ํญ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
c#
var value2 = fixture.Build<Model>()
.FromFactory((int id, string name) => new Model(id, name))
.Create();
๋ถํํ๋, ๋งค๊ฐ๋ณ์ ์๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ํ์ฅ์ฑ์ด ์ข์ง ์์ต๋๋ค ๐
@ajorians ๋ง์ ์์ ์ ๋ ฅ ์ธ์๊ฐ ์๋ ๋ชจ๋ธ์ด ์์ผ๋ฏ๋ก ๋ช ์์ ์ผ๋ก ๊ฑฑ์ ํ ํ์ ์์ด ๊ทธ ์ค ํ๋๋ง ์ฌ์ฉ์ ์ง์ ํ๋ ค๋ ๋ฌธ์ ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๊ณ
๋ค, ๋ง์ต๋๋ค.
๋ถํํ๋, ๋งค๊ฐ๋ณ์ ์๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ํ์ฅ์ฑ์ด ์ข์ง ์์ต๋๋ค ๐
์ด ์ข๊ฒ๋ Freeze
๋ ๋งค๊ฐ๋ณ์ ์๊ฐ ์ฆ๊ฐํ๋ ๋ง์ ํด๋์ค์์ ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์, ์์ฑ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ํํ๊ธฐ ์ํด ์ฌ์ฉ์ ์ ์๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ํด๋์ค์๋ ํ์ฌ 30
๋งค๊ฐ๋ณ์๋ณด๋ค ๋ง์ ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ง๋ ์ฌํด๊ฐ ๋๋๊ธฐ ์ ์ 4
์ ๋ ์ถ๊ฐ๋ก ์ฑ์ฅํ ๊ฒ์
๋๋ค.
๋๋ ์ด๊ฒ์ด ๋น์ ์์ ์ผ ์ ์์ต๋๋ค.
ํ์ง๋ง ์, ์
๋ ฅ ์์ฑ์ ์ธ์๊ฐ ๋ง์ด ์ฆ๊ฐํ๊ณ ์์ผ๋ฉฐ ๋๋จธ์ง๋ ์๊ฐํ์ง ์๊ณ ๊ทธ ์ค ํ๋๋ง(๋๋ ๋ช ๊ฐ) ์ฌ์ฉ์ ์ ์ํ๊ณ ์ถ์ต๋๋ค. ์ ์ฒด ํ
์คํธ์ ๋ํด ํด๋น ์ ํ์ ๋ฑ๋กํ๊ฑฐ๋ ๋๊ฒฐํ์ง ์๊ณ . ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ ์ ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฐ๊ฒฐํ ๋ฐฉ๋ฒ์ ์ฝ 5
์ฝ๋ ์ค์
๋๋ค.
๋๋ ์ด ์ข๊ฒ๋ ๊ทธ ๋ชจ๋ ๊ฒ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ํ ๋ฐฉ์์ ํด๋ผ์ด์ธํธ ์ธก ์ฝ๋์์ clone
ํ์ฅ ๋ฉ์๋๋ฅผ ๋ง๋๋ ๊ฒ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
์ด ๋ชจ๋ ๊ฒ์ด ์๋ฏธ๊ฐ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ ์ ํจ๊ป ๋ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค :smiley:
@ajorians ํ๋์ด ์์ด ๋ฌธ์ ๋ฅผ ๋ซ์ผ
๋๋ ๋น์ ์ ๋์์ธ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ณ ๋ ค ํ์ต๋๊น?
์์ฑ์๋ฅผ ๋ณด๋ฉด ๋ช ๊ฐ์ง ๋ฌธ์ ์ ๋ฌธ์ ์ ๋ํ ์ ์ฌ์ ์ธ ์๋ฃจ์ ์ ๋ณผ ์ ์์ต๋๋ค.
์ฐ์ ์ ๊ท ๋ฐ ์ฃผ์
๊ฐ๋ฅํ ์ํฐํฐ์ ๊ฐ๋
์ ํผํฉํ๊ณ ์์ต๋๋ค.
๊ฐ์ฅ ๊ฐ๋จํ ์๋ฃจ์
์ ์ฃผ์
๊ฐ๋ฅํ ์ข
์์ฑ(์๋น์ค ์ธํฐํ์ด์ค๋ผ๊ณ ๋ ํจ)์ ์์ฑ์ผ๋ก ์ด๋ํ๊ณ ์์ฑ ์ฃผ์
์ ์ฌ์ฉํ์ฌ ์ฃผ์
ํ๋ ๊ฒ์
๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด Fixture
๋ฅผ ๋ณต์ฌํด์ผ ํ๋ ์ฆ๊ฐ์ ์ธ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๊ณ ์์ฑ์๊ฐ ๋ ๊ด๋ฆฌํ๊ธฐ ์ฌ์์ง๋๋ค.
๋ ๋ฒ์งธ๋ ๊ณผ๋ค ์ฃผ์
์ฝ๋ ๋์๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์
๋๋ค.
์ด๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ํจ๊ป ์ฌ์ฉ๋๋ ์๋น์ค๋ฅผ ๋ณ๋์ ์ถ์ํ๋ก ์ฎ๊ธฐ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ด๊ฒ์ ๋น์ ์ ๋์์ธ์ด SRP๋ฅผ ์กด์คํ๋ ๋ฐ ๋์์ด ๋๋ฉฐ ํ์ฅ์ ํตํด ํ
์คํธ์์ ํ์ฌ ์ํํด์ผ ํ๋ ์์ฒญ๋ ์์ ์ค์ ์ ์ค์ฌ์ผ ํฉ๋๋ค.
ํด๋์ค ์ด๋ฆ์ด ViewModel
์ด๋ฏ๋ก MVVM ์ ํ๋ฆฌ์ผ์ด์
์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ฉ์์ง ๋ชจ๋ธ์ ๋์
ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๋์ฑ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค. ์๋ง๋ ์ด๋ฒคํธ ์์ง๊ธฐ์ผ ๊ฒ์
๋๋ค. ๋๋ถ๋ถ์ MVVM ํ๋ ์์ํฌ์๋ ์ด๋ฌํ ํ๋ ์์ํฌ๊ฐ ๋ด์ฅ๋์ด ์์ผ๋ฏ๋ก ๋ง์ ์ค์ ์์
์ ์ํํ ํ์๊ฐ ์์ต๋๋ค.
๋์์ด ๋๋์ง ์๋ ค์ฃผ์ธ์.
์๋ ํ์ธ์ @aivascu ๋
@ajorians ํ๋์ด ์์ด ์ด์๋ฅผ ์ข ๋ฃํ๋ ค ํ์ต๋๋ค.
์ ๊ฐ ํ ์ ์๋ ์ผ์ด ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์. ๊ตฌํ๋ ๋๊น์ง ๋ณผ ์ ์๋ ๊ธฐ๋ฅ ์์ฒญ์ด๊ธฐ ๋๋ฌธ์ ์๋นํ ๋ง์ ๋นํ์ฑ ์ํ๊ฐ ์์ ์ ์์ต๋๋ค.
๋๋ ๋น์ ์ ๋์์ธ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ณ ๋ ค ํ์ต๋๊น?
ํ์ฌ ์ฐ๋ฆฌ๋ ํ๋ฆฌ์ฆ ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋๋ ๊ฒ์ ๊ณ ๋ คํ๊ณ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋น์ ์ด ์ธ๊ธ ํ ํญ๋ชฉ ์ค ์ผ๋ถ์ ๋์์ด ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์ฌํ๊ฒ๋ ๋๋ null
ํ ๋ฒ ํ์ธ๋๊ณ readonly
๋๊ณ ํญ์ null
๊ฐ ๋์ง ์๋๋ก ๋ชจ๋ ๊ฒ์ ์์ฑ์์ ๋ฃ๋ ์ฒ ํ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋ณด์ง ๋ชปํ์ต๋๋ค
๋์์ด ๋๋์ง ์๋ ค์ฃผ์ธ์.
์ด ๋ชจ๋ ๊ฒ์ด ๋์์ด ๋ฉ๋๋ค. ์ ์ธ๊ณ ์ฌ๋๋ค๋ ์ฐ๋ฆฌ๊ฐ ๋ณํ๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค๊ณ ์๊ฐํ๋ค๋ ์ฌ์ค์ ํ์ ์๋ฆด ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ IFixture
๊ฐ Clone
๋๋ ์ด์ ์ ์ฌํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ธ์ง ๋ฌผ์ ์ ์์ต๋๊น? ์๋๋ฉด ์ด๋ป๊ฒ๋ ์ฌ๋๋ค์ด ์ฌ์ฉ์ ์ ์๋ฅผ ์ถ๊ฐํ ๋ค์ ๋ง์ง๋ง์ผ๋ก ์ถ๊ฐ๋ ์ฌ์ฉ์ ์ ์๋ฅผ pop
ํด์ ํ๊ฑฐ๋ ์ฌ์ฉ์ ์ ์๋ฅผ ์ถ๊ฐํ๊ธฐ ์ ์ํ๋ก ๋์๊ฐ๋๋ก ํ์ฉํ์๊ฒ ์ต๋๊น? ์ด ์ํ๋ ๋์์ ์ ๋ฐํ๋ ์๋๋ฆฌ์ค๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํ๋ฉฐ ์๋๋ฆฌ์ค์๋ ์ฒ์๋ถํฐ ๋ง์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ข์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋ ํ ๋ณต์ก์ฑ์ ์ถ๊ฐํ๊ณ ์ถ์ง ์๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๋ค์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ์ง๋ ์ฌ๋ฌ๋ถ์ด ์ ํํ ์ ์์ง๋ง ์ ๊ฐ ๋์ธ ์ ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์.
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค :smiley:
@ajorians ์ ์๊ฒฌ์ .Clone()
๋ฉ์๋๋ฅผ Fixture
ํด๋์ค์ ์ถ๊ฐํด์๋ ์ ๋๋ค๋ ๊ฒ์
๋๋ค. ๋ด๊ฐ ๋ณด๊ธฐ์ ๋จ์ผ ํ
์คํธ์ ๋ํด ์ฃผ์ด์ง ์๊ฐ์ ํ๋์ ํ
์คํธ ํฝ์ค์ฒ๋ง ์์ด์ผ ํฉ๋๋ค.
๊ณผ๊ฑฐ์ unfreeze/eject/freeze-once ๊ธฐ๋ฅ์ ๊ตฌํํด ๋ฌ๋ผ๋ ์์ฒญ์ด ๋ช ์ฐจ๋ก ์์์ง๋ง ์๋ฌด๋ ๊ตฌํํ์ง ์์์ต๋๋ค.
๊ทธ ์ด์ ๋ ๋๊ฒฐ๋ ๊ฐ์ ๋ฐํํ ๋น๋ ๋๋ ๋ง์ง๋ง์ผ๋ก ์ฃผ์
๋ ๊ฐ์ด ๋ฌด์์ธ์ง ์์ ์ ์ผ๋ก ์๋ณํ ์ ์๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋น์ ์ด ํ ์ ์๋ ์ผ์ ์๋์ ๊ฐ์ด ์ฑ๊ณต์ ์ธ ํด๊ฒฐ์ ํน์ ํ์ ํ์ ์์ฒญ์ ๋ฌด์ํ๋ ๋ฆด๋ ์ด๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋๋ค. ํน์ ์์ ์์ฒญ์ ๊ฑด๋๋ฐ๋๋ก ๊ตฌํ์ ์ ๋ฐ์ดํธํ ์๋ ์์ต๋๋ค. ๋๋จธ์ง๋ ์๋ ๊ฒ์๋ฌผ์์ ์ฌ์ฉํ ์ฌ์ฉ์ ์ ์๋ก ๋ค๋ฃจ์ด์ผ ํฉ๋๋ค.
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
์ด๋ฏ๋ก MVVM ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ฉ์์ง ๋ชจ๋ธ์ ๋์ ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์ฑ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค. ์๋ง๋ ์ด๋ฒคํธ ์์ง๊ธฐ์ผ ๊ฒ์ ๋๋ค. ๋๋ถ๋ถ์ MVVM ํ๋ ์์ํฌ์๋ ์ด๋ฌํ ํ๋ ์์ํฌ๊ฐ ๋ด์ฅ๋์ด ์์ผ๋ฏ๋ก ๋ง์ ์ค์ ์์ ์ ์ํํ ํ์๊ฐ ์์ต๋๋ค.๋์์ด ๋๋์ง ์๋ ค์ฃผ์ธ์.