Autofixture: λͺ¨μ˜λ₯Ό 고정해도 μ£Όμž…λœ μΈμŠ€ν„΄μŠ€κ°€ μž¬μ •μ˜λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2018λ…„ 07μ›” 31일  Β·  1논평  Β·  좜처: AutoFixture/AutoFixture

ν˜„μž¬ 행동

두 개의 ꡬ체적인 μΈμŠ€ν„΄μŠ€λ₯Ό μ£Όμž…ν•  λ•Œ 두 번째 μΈμŠ€ν„΄μŠ€κ°€ 첫 번째 μΈμŠ€ν„΄μŠ€λ₯Ό μž¬μ •μ˜ν•©λ‹ˆλ‹€.

ꡬ체적인 μΈμŠ€ν„΄μŠ€λ₯Ό μ‚½μž…ν•œ λ‹€μŒ 쑰둱된 μΈμŠ€ν„΄μŠ€λ₯Ό μ‚½μž…ν•  λ•Œ 두 번째 μΈμŠ€ν„΄μŠ€λŠ” 첫 번째 μΈμŠ€ν„΄μŠ€λ₯Ό μž¬μ •μ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이것은 λͺ¨μ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 일뢀 ν…ŒμŠ€νŠΈμ™€ κ΅¬ν˜„μ„ μ‚¬μš©ν•˜λŠ” 일뢀 ν…ŒμŠ€νŠΈ(ν…ŒμŠ€νŠΈ 간에 κ³ μ • μž₯치λ₯Ό κ³΅μœ ν•˜κΈ° μœ„ν•΄ ν…ŒμŠ€νŠΈ 클래슀 μƒμ„±μžλ₯Ό μ‚¬μš©)λ₯Ό μˆ˜ν–‰ν•˜λŠ” 아이디어λ₯Ό μƒλ‹Ήνžˆ μ–΄μƒ‰ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€.

μ˜ˆμƒλ˜λŠ” λ™μž‘

두 개의 ꡬ체적인 μΈμŠ€ν„΄μŠ€λ₯Ό μ£Όμž…ν•  λ•Œ 두 번째 μΈμŠ€ν„΄μŠ€κ°€ 첫 번째 μΈμŠ€ν„΄μŠ€λ₯Ό μž¬μ •μ˜ν•©λ‹ˆλ‹€.

ꡬ체적인 μΈμŠ€ν„΄μŠ€λ₯Ό μ£Όμž…ν•œ λ‹€μŒ 쑰둱된 μΈμŠ€ν„΄μŠ€λ₯Ό μ£Όμž…ν•˜λ©΄ 두 번째 μΈμŠ€ν„΄μŠ€κ°€ 첫 번째 μΈμŠ€ν„΄μŠ€λ₯Ό μž¬μ •μ˜ν•©λ‹ˆλ‹€.

μ˜ˆμƒλ˜λŠ” λ™μž‘μ˜ 예

```C#
System.Collections.Generic μ‚¬μš©;
AutoFixture μ‚¬μš©;
AutoFixture.AutoMoq μ‚¬μš©;
Moqλ₯Ό μ‚¬μš©ν•˜μ—¬;
Xunit을 μ‚¬μš©ν•˜μ—¬;

λ„€μž„μŠ€νŽ˜μ΄μŠ€ SomeNamespace
{
곡개 클래슀 AutoFixtureTests
{
[사싀]
// 톡과
곡개 무효 Should_OverridePreviouslyInjectedString()
{
const λ¬Έμžμ—΄ test1 = "test1";
const λ¬Έμžμ—΄ test2 = "test2";

        var fixture = new Fixture();

        fixture.Inject(test1);
        fixture.Inject(test2);

        Assert.Equal(fixture.Create<string>(), test2);
    }

    [Fact]
    // Fails
    public void Should_OverridePreviouslyInjectedInstance()
    {
        var fixture = new Fixture().Customize(new AutoMoqCustomization());

        var sut1 = new List<int>();

        fixture.Inject<IList<int>>(sut1);
        fixture.Freeze<Mock<IList<int>>>();

        var sut2 = fixture.Create<IList<int>>();

        Assert.NotSame(sut1, sut2);
    }
}

}
```

question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ•ˆλ…•ν•˜μ„Έμš” @charles-salmon λ‹˜,

μ‹œκ°„μ„ λ‚΄μ–΄ μ‹ κ³ ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

당신이 κ΄€μ°°ν•˜κ³  μžˆλŠ” 행동은 _섀계에 μ˜ν•œ_ κ²ƒμž…λ‹ˆλ‹€. μ„€λͺ…을 λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€. πŸ™‚

Freeze<T> λ©”μ†Œλ“œ 의 κ΅¬ν˜„ 을 보면:

var value = fixture.Create<T>();
fixture.Inject(value);
return value;

T 의 ν‘œλ³Έμ„ λ§Œλ“€κ³  κ³ μ • μž₯μΉ˜μ— μ£Όμž…ν•˜λŠ” 것이 μ „λΆ€μž„μ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œ Freeze λ©”μ„œλ“œλŠ” λ°”λ‘œ 이 μž‘μ—…μ— λŒ€ν•œ νŽΈλ¦¬ν•œ μ§€λ¦„κΈΈμž…λ‹ˆλ‹€. @ploeh λŠ” 2010λ…„ Freeze 방법을 μ†Œκ°œν•œ 그의 κ²Œμ‹œλ¬Όμ—μ„œ λ‹€μŒ

μš°λ¦¬λŠ” 이 μ½”λ”© κ΄€μš©κ΅¬λ₯Ό λ„ˆλ¬΄ 많이 μ‚¬μš©ν•˜μ—¬ νŽΈλ¦¬ν•œ λ°©λ²•μœΌλ‘œ μΊ‘μŠν™”ν•˜κΈ°λ‘œ κ²°μ •ν–ˆμŠ΅λ‹ˆλ‹€. μ•½κ°„μ˜ ν† λ‘  후에 μš°λ¦¬λŠ” FreezeλΌλŠ” 이름에 λ„λ‹¬ν–ˆμŠ΅λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ μš°λ¦¬λŠ” μƒˆ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ κΈ°λ³Έ μ•Œκ³ λ¦¬μ¦˜μ„ μš°νšŒν•˜μ—¬ κ³ μ • μž₯μΉ˜μ—μ„œ 단일 읡λͺ… λ³€μˆ˜λ₯Ό 본질적으둜 κ³ μ •ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

이λ₯Ό κ°μ•ˆν•  λ•Œ λ™μΌν•œ μœ ν˜•μ˜ T λ₯Ό μ£Όμž…λœ μΈμŠ€ν„΄μŠ€λ‘œ κ³ μ •ν•˜λ©΄ λ™μΌν•œ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λœλ‹€λŠ” 것은 λ†€λΌμš΄ 일이 μ•„λ‹™λ‹ˆλ‹€.

이제 κ·€ν•˜μ˜ μš”μ μ„ ν•΄κ²°ν•˜λ €λ©΄ λ‹€μŒμ„ μˆ˜ν–‰ν•˜μ‹­μ‹œμ˜€.

이것은 λͺ¨μ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 일뢀 ν…ŒμŠ€νŠΈμ™€ κ΅¬ν˜„μ„ μ‚¬μš©ν•˜λŠ” 일뢀 ν…ŒμŠ€νŠΈ(ν…ŒμŠ€νŠΈ 간에 κ³ μ • μž₯치λ₯Ό κ³΅μœ ν•˜κΈ° μœ„ν•΄ ν…ŒμŠ€νŠΈ 클래슀 μƒμ„±μžλ₯Ό μ‚¬μš©)λ₯Ό μˆ˜ν–‰ν•˜λŠ” 아이디어λ₯Ό μƒλ‹Ήνžˆ μ–΄μƒ‰ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€.

κ³ μ • μž₯μΉ˜κ°€ ν…ŒμŠ€νŠΈκ°€ μ‹€ν–‰λ˜λŠ” _context_λ₯Ό λ‚˜νƒ€λ‚΄λ©΄ μ—¬λŸ¬ ν…ŒμŠ€νŠΈ κ°€ λ™μΌν•œ κ³ μ • μž₯치λ₯Ό κ³΅μœ ν•˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€ . κ·ΈλŸ¬λ‚˜ 이것은 μ—¬λŸ¬ 가지(좩돌 κ°€λŠ₯성이 μžˆλŠ”) 문제λ₯Ό ν˜Όν•©ν•˜λŠ” λŒ€κ°€λ₯Ό 치λ₯΄κ²Œ λ©λ‹ˆλ‹€.

xUnit Patterns 책은 λ‹€μŒκ³Ό 같이 μš”μ•½ν•©λ‹ˆλ‹€ .

A의 κ°€μž₯ 큰 문제 곡유 치ꡬ λŠ” μ•„λ§ˆλ„ μ‹€ν—˜ κ²°κ³Ό 사이에 "좩돌"을 μ΄ˆλž˜ν•  수 μžˆλ‹€λŠ” 것이닀 비정상적 ν…ŒμŠ€νŠΈ ν…ŒμŠ€νŠΈλŠ” λ‹€λ₯Έ μ‹œν—˜ 결과에 의쑴 ν•  수 있기 λ•Œλ¬Έμ΄λ‹€. 또 λ‹€λ₯Έ λ¬Έμ œλŠ” λ§Žμ€ ν…ŒμŠ€νŠΈλ₯Ό μ œκ³΅ν•˜λ„λ‘ μ„€κ³„λœ κ³ μ • μž₯μΉ˜κ°€ 단일 ν…ŒμŠ€νŠΈμ— ν•„μš”ν•œ μ΅œμ†Œ κ³ μ • μž₯치 보닀 훨씬 더 λ³΅μž‘ν•  μˆ˜λ°–μ— μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

이 "좩돌"은 ν…ŒμŠ€νŠΈμ—μ„œ T μœ ν˜•μ˜ κ°œμ²΄κ°€ νŠΉμ • μΈμŠ€ν„΄μŠ€μΌ κ²ƒμœΌλ‘œ μ˜ˆμƒν•˜λŠ” 반면 λ‹€λ₯Έ ν…ŒμŠ€νŠΈμ—μ„œλŠ” T κ°€ κ°€μ§œ 개체 T κ²ƒμœΌλ‘œ μ˜ˆμƒν•  λ•Œ λ°œμƒ ν•©λ‹ˆλ‹€ .

T 같은 μœ ν˜•μ΄ λͺ¨μ˜ _및_ ꡬ체적인 μΈμŠ€ν„΄μŠ€κ°€ λ˜λŠ” 것이 μ˜λ―Έκ°€ μžˆλŠ” ν…ŒμŠ€νŠΈ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό 생각할 수 μ—†κΈ° λ•Œλ¬Έμ— (잘λͺ»λœ κ²ƒμœΌλ‘œ μž…μ¦λ˜μ–΄ κΈ°μ©λ‹ˆλ‹€) λ‹€μŒμ„ μ œμ•ˆν•©λ‹ˆλ‹€. ν…ŒμŠ€νŠΈλŠ” 각각의 νŠΉμ • μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μ œκ³΅ν•˜λ„λ‘ κ΅¬μ„±λœ μ„œλ‘œ λ‹€λ₯Έ κ³ μ • μž₯치λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

>λͺ¨λ“  λŒ“κΈ€

μ•ˆλ…•ν•˜μ„Έμš” @charles-salmon λ‹˜,

μ‹œκ°„μ„ λ‚΄μ–΄ μ‹ κ³ ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

당신이 κ΄€μ°°ν•˜κ³  μžˆλŠ” 행동은 _섀계에 μ˜ν•œ_ κ²ƒμž…λ‹ˆλ‹€. μ„€λͺ…을 λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€. πŸ™‚

Freeze<T> λ©”μ†Œλ“œ 의 κ΅¬ν˜„ 을 보면:

var value = fixture.Create<T>();
fixture.Inject(value);
return value;

T 의 ν‘œλ³Έμ„ λ§Œλ“€κ³  κ³ μ • μž₯μΉ˜μ— μ£Όμž…ν•˜λŠ” 것이 μ „λΆ€μž„μ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œ Freeze λ©”μ„œλ“œλŠ” λ°”λ‘œ 이 μž‘μ—…μ— λŒ€ν•œ νŽΈλ¦¬ν•œ μ§€λ¦„κΈΈμž…λ‹ˆλ‹€. @ploeh λŠ” 2010λ…„ Freeze 방법을 μ†Œκ°œν•œ 그의 κ²Œμ‹œλ¬Όμ—μ„œ λ‹€μŒ

μš°λ¦¬λŠ” 이 μ½”λ”© κ΄€μš©κ΅¬λ₯Ό λ„ˆλ¬΄ 많이 μ‚¬μš©ν•˜μ—¬ νŽΈλ¦¬ν•œ λ°©λ²•μœΌλ‘œ μΊ‘μŠν™”ν•˜κΈ°λ‘œ κ²°μ •ν–ˆμŠ΅λ‹ˆλ‹€. μ•½κ°„μ˜ ν† λ‘  후에 μš°λ¦¬λŠ” FreezeλΌλŠ” 이름에 λ„λ‹¬ν–ˆμŠ΅λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ μš°λ¦¬λŠ” μƒˆ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ κΈ°λ³Έ μ•Œκ³ λ¦¬μ¦˜μ„ μš°νšŒν•˜μ—¬ κ³ μ • μž₯μΉ˜μ—μ„œ 단일 읡λͺ… λ³€μˆ˜λ₯Ό 본질적으둜 κ³ μ •ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

이λ₯Ό κ°μ•ˆν•  λ•Œ λ™μΌν•œ μœ ν˜•μ˜ T λ₯Ό μ£Όμž…λœ μΈμŠ€ν„΄μŠ€λ‘œ κ³ μ •ν•˜λ©΄ λ™μΌν•œ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λœλ‹€λŠ” 것은 λ†€λΌμš΄ 일이 μ•„λ‹™λ‹ˆλ‹€.

이제 κ·€ν•˜μ˜ μš”μ μ„ ν•΄κ²°ν•˜λ €λ©΄ λ‹€μŒμ„ μˆ˜ν–‰ν•˜μ‹­μ‹œμ˜€.

이것은 λͺ¨μ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 일뢀 ν…ŒμŠ€νŠΈμ™€ κ΅¬ν˜„μ„ μ‚¬μš©ν•˜λŠ” 일뢀 ν…ŒμŠ€νŠΈ(ν…ŒμŠ€νŠΈ 간에 κ³ μ • μž₯치λ₯Ό κ³΅μœ ν•˜κΈ° μœ„ν•΄ ν…ŒμŠ€νŠΈ 클래슀 μƒμ„±μžλ₯Ό μ‚¬μš©)λ₯Ό μˆ˜ν–‰ν•˜λŠ” 아이디어λ₯Ό μƒλ‹Ήνžˆ μ–΄μƒ‰ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€.

κ³ μ • μž₯μΉ˜κ°€ ν…ŒμŠ€νŠΈκ°€ μ‹€ν–‰λ˜λŠ” _context_λ₯Ό λ‚˜νƒ€λ‚΄λ©΄ μ—¬λŸ¬ ν…ŒμŠ€νŠΈ κ°€ λ™μΌν•œ κ³ μ • μž₯치λ₯Ό κ³΅μœ ν•˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€ . κ·ΈλŸ¬λ‚˜ 이것은 μ—¬λŸ¬ 가지(좩돌 κ°€λŠ₯성이 μžˆλŠ”) 문제λ₯Ό ν˜Όν•©ν•˜λŠ” λŒ€κ°€λ₯Ό 치λ₯΄κ²Œ λ©λ‹ˆλ‹€.

xUnit Patterns 책은 λ‹€μŒκ³Ό 같이 μš”μ•½ν•©λ‹ˆλ‹€ .

A의 κ°€μž₯ 큰 문제 곡유 치ꡬ λŠ” μ•„λ§ˆλ„ μ‹€ν—˜ κ²°κ³Ό 사이에 "좩돌"을 μ΄ˆλž˜ν•  수 μžˆλ‹€λŠ” 것이닀 비정상적 ν…ŒμŠ€νŠΈ ν…ŒμŠ€νŠΈλŠ” λ‹€λ₯Έ μ‹œν—˜ 결과에 의쑴 ν•  수 있기 λ•Œλ¬Έμ΄λ‹€. 또 λ‹€λ₯Έ λ¬Έμ œλŠ” λ§Žμ€ ν…ŒμŠ€νŠΈλ₯Ό μ œκ³΅ν•˜λ„λ‘ μ„€κ³„λœ κ³ μ • μž₯μΉ˜κ°€ 단일 ν…ŒμŠ€νŠΈμ— ν•„μš”ν•œ μ΅œμ†Œ κ³ μ • μž₯치 보닀 훨씬 더 λ³΅μž‘ν•  μˆ˜λ°–μ— μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

이 "좩돌"은 ν…ŒμŠ€νŠΈμ—μ„œ T μœ ν˜•μ˜ κ°œμ²΄κ°€ νŠΉμ • μΈμŠ€ν„΄μŠ€μΌ κ²ƒμœΌλ‘œ μ˜ˆμƒν•˜λŠ” 반면 λ‹€λ₯Έ ν…ŒμŠ€νŠΈμ—μ„œλŠ” T κ°€ κ°€μ§œ 개체 T κ²ƒμœΌλ‘œ μ˜ˆμƒν•  λ•Œ λ°œμƒ ν•©λ‹ˆλ‹€ .

T 같은 μœ ν˜•μ΄ λͺ¨μ˜ _및_ ꡬ체적인 μΈμŠ€ν„΄μŠ€κ°€ λ˜λŠ” 것이 μ˜λ―Έκ°€ μžˆλŠ” ν…ŒμŠ€νŠΈ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό 생각할 수 μ—†κΈ° λ•Œλ¬Έμ— (잘λͺ»λœ κ²ƒμœΌλ‘œ μž…μ¦λ˜μ–΄ κΈ°μ©λ‹ˆλ‹€) λ‹€μŒμ„ μ œμ•ˆν•©λ‹ˆλ‹€. ν…ŒμŠ€νŠΈλŠ” 각각의 νŠΉμ • μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μ œκ³΅ν•˜λ„λ‘ κ΅¬μ„±λœ μ„œλ‘œ λ‹€λ₯Έ κ³ μ • μž₯치λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰