Autofixture: FromFactoryκ°€ μ˜λ„ν•œ λŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2017λ…„ 10μ›” 26일  Β·  3μ½”λ©˜νŠΈ  Β·  좜처: AutoFixture/AutoFixture

μ•ˆλ…•ν•˜μ„Έμš”,

```C#
[ν…ŒμŠ€νŠΈν”½μŠ€μ²˜]
곡개 클래슀 TestAutoFixture {

    public class TestClass
    {
        public string Property { get; set; }
    }

    [Test]
    public void Test()
    {
        var f = new Fixture();
        f.Customize<TestClass>(composer => composer.FromFactory(() => new TestClass { Property = "foobar" }));

        var o = f.Create<TestClass>();

        Assert.That(o.Property, Is.EqualTo("foobar"));
    }
}

```

이 ν…ŒμŠ€νŠΈλŠ” .NET Core 2μ—μ„œ 4.0.0-rc1을 μ‚¬μš©ν•˜μ—¬ μ‹€νŒ¨ν•©λ‹ˆλ‹€.
λ‚˜λŠ” 이것이 μ˜€ν•΄μ˜ μ†Œμ§€κ°€ μžˆκ±°λ‚˜ (λ˜λŠ” β€‹β€‹λ¬Έμ„œν™”λ˜μ§€ μ•Šμ€) 손상 λ˜μ—ˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.
νŽΈμ§‘ : 깨지지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€. μ•„λž˜ 주석을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

question

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

λ¬Έμ„œμ— λ¬Έμ œκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€ ☺️

기본적으둜 AutoFixtureλŠ” fixture.OmitAutoProperties = true λ₯Ό μ„€μ •ν•˜μ—¬ ν•΄λ‹Ή λ™μž‘μ„ λΉ„ν™œμ„±ν™”ν•˜μ§€ μ•ŠλŠ” ν•œ 곡개 setter둜 속성을 μžλ™μœΌλ‘œ μ±„μ›λ‹ˆλ‹€. composer.FromFactory() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ νŠΉμ • μœ ν˜•μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό ν™œμ„±ν™”ν•˜λŠ” 방법을 지정할 수 μžˆμ§€λ§Œ λ‚˜μ€‘μ— ν•΄λ‹Ή κ°œμ²΄μ— λŒ€ν•œ 속성이 계속 ν• λ‹Ήλ©λ‹ˆλ‹€.

μ‹€μ œλ‘œ μ μ ˆν•œ AutoFixture API μ‚¬μš©μ€ μ‹œλ‚˜λ¦¬μ˜€μ— 따라 λ‹€λ¦…λ‹ˆλ‹€. μœ„μ˜ μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ κ°€μž₯ "κ΄€μš©μ μΈ" μ‚¬μš©λ²•μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

```c#
f.μ‚¬μš©μž μ •μ˜(c => c
.FromFactory(() => μƒˆλ‘œμš΄ TestClass())
.With(x => x.Property, "foobar"));

or even the simplified one as AutoFixture will automatically pick up that constructor:
```c#
f.Customize<TestClass>(c => c
    .With(x => x.Property, "foobar"));

λ˜λŠ” λ‹€μŒκ³Ό 같이 ν•„μš”ν•œ 경우 μžλ™ 속성 μ±„μš°κΈ°λ₯Ό λΉ„ν™œμ„±ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
```c#
f.μ‚¬μš©μž μ •μ˜(c => c
.FromFactory(() => μƒˆλ‘œμš΄ TestClass { 속성 = "foobar" })
.OmitAutoProperties());

However, in this case, probably, the `Customize<>()` API is an overhead. Instead, it's simpler to use the `fixture.Register()` method as it allows to use the constructed instance "as-is" without any post-processing:

```c#
f.Register(() => new TestClass { Property = "foobar" });

μ–΄λ–€ μ •ν™•ν•œ APIκ°€ 더 μ ν•©ν•œμ§€ μ΄ν•΄ν•˜λŠ” 것이 μ²˜μŒμ—λŠ” ν˜Όλž€μŠ€λŸ¬μšΈ 수 μžˆμ§€λ§Œ λ‚˜μ€‘μ—λŠ” 더 μ‰¬μ›Œμ§ˆ κ²ƒμž…λ‹ˆλ‹€. πŸ˜‰ 이 λͺ¨λ“  APIλŠ” μœ μ—°μ„±μ„ μ œκ³΅ν•˜κ³  λ‹€μ–‘ν•œ μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ λ‹€λ₯Έ μ˜΅μ…˜μ΄ 더 μ’‹μ•„ λ³΄μž…λ‹ˆλ‹€.

아직 λͺ…ν™•νžˆ ν•΄μ•Ό ν•  질문이 μžˆλŠ” 경우 μ•Œλ €μ£Όμ‹œλ©΄ 기꺼이 λ„μ™€λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

μΆ”μ‹ : λ‹€μŒ 링크도 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

PPS composer.Without(x => x.Property) μž‘λ™ν•˜λŠ” μ΄μœ λŠ” 이 ν‘œν˜„μ‹μ΄ νŠΉμ • 속성/ν•„λ“œμ— λŒ€ν•œ μžλ™ 속성을 λΉ„ν™œμ„±ν™”ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 이 경우 AutoFixtureλŠ” 초기 개체 값을 μžλ™μœΌλ‘œ μƒμ„±λœ κ°’μœΌλ‘œ μž¬μ •μ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

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

FromFactory λ©”μ„œλ“œ 뒀에 .Without(_ => _.Property) μΆ”κ°€ν•˜λ©΄ μ˜λ„ν•œ λŒ€λ‘œ μž‘λ™ν•œλ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€.
λ‚˜λŠ” 이것이 맀우 직관적이지 μ•Šλ‹€κ³  μƒκ°ν•˜μ§€λ§Œ 버그가 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— 이것을 닫을 수 μžˆμŠ΅λ‹ˆλ‹€.

λ¬Έμ„œμ— λ¬Έμ œκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€ ☺️

기본적으둜 AutoFixtureλŠ” fixture.OmitAutoProperties = true λ₯Ό μ„€μ •ν•˜μ—¬ ν•΄λ‹Ή λ™μž‘μ„ λΉ„ν™œμ„±ν™”ν•˜μ§€ μ•ŠλŠ” ν•œ 곡개 setter둜 속성을 μžλ™μœΌλ‘œ μ±„μ›λ‹ˆλ‹€. composer.FromFactory() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ νŠΉμ • μœ ν˜•μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό ν™œμ„±ν™”ν•˜λŠ” 방법을 지정할 수 μžˆμ§€λ§Œ λ‚˜μ€‘μ— ν•΄λ‹Ή κ°œμ²΄μ— λŒ€ν•œ 속성이 계속 ν• λ‹Ήλ©λ‹ˆλ‹€.

μ‹€μ œλ‘œ μ μ ˆν•œ AutoFixture API μ‚¬μš©μ€ μ‹œλ‚˜λ¦¬μ˜€μ— 따라 λ‹€λ¦…λ‹ˆλ‹€. μœ„μ˜ μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ κ°€μž₯ "κ΄€μš©μ μΈ" μ‚¬μš©λ²•μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

```c#
f.μ‚¬μš©μž μ •μ˜(c => c
.FromFactory(() => μƒˆλ‘œμš΄ TestClass())
.With(x => x.Property, "foobar"));

or even the simplified one as AutoFixture will automatically pick up that constructor:
```c#
f.Customize<TestClass>(c => c
    .With(x => x.Property, "foobar"));

λ˜λŠ” λ‹€μŒκ³Ό 같이 ν•„μš”ν•œ 경우 μžλ™ 속성 μ±„μš°κΈ°λ₯Ό λΉ„ν™œμ„±ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
```c#
f.μ‚¬μš©μž μ •μ˜(c => c
.FromFactory(() => μƒˆλ‘œμš΄ TestClass { 속성 = "foobar" })
.OmitAutoProperties());

However, in this case, probably, the `Customize<>()` API is an overhead. Instead, it's simpler to use the `fixture.Register()` method as it allows to use the constructed instance "as-is" without any post-processing:

```c#
f.Register(() => new TestClass { Property = "foobar" });

μ–΄λ–€ μ •ν™•ν•œ APIκ°€ 더 μ ν•©ν•œμ§€ μ΄ν•΄ν•˜λŠ” 것이 μ²˜μŒμ—λŠ” ν˜Όλž€μŠ€λŸ¬μšΈ 수 μžˆμ§€λ§Œ λ‚˜μ€‘μ—λŠ” 더 μ‰¬μ›Œμ§ˆ κ²ƒμž…λ‹ˆλ‹€. πŸ˜‰ 이 λͺ¨λ“  APIλŠ” μœ μ—°μ„±μ„ μ œκ³΅ν•˜κ³  λ‹€μ–‘ν•œ μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ λ‹€λ₯Έ μ˜΅μ…˜μ΄ 더 μ’‹μ•„ λ³΄μž…λ‹ˆλ‹€.

아직 λͺ…ν™•νžˆ ν•΄μ•Ό ν•  질문이 μžˆλŠ” 경우 μ•Œλ €μ£Όμ‹œλ©΄ 기꺼이 λ„μ™€λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

μΆ”μ‹ : λ‹€μŒ 링크도 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

PPS composer.Without(x => x.Property) μž‘λ™ν•˜λŠ” μ΄μœ λŠ” 이 ν‘œν˜„μ‹μ΄ νŠΉμ • 속성/ν•„λ“œμ— λŒ€ν•œ μžλ™ 속성을 λΉ„ν™œμ„±ν™”ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 이 경우 AutoFixtureλŠ” 초기 개체 값을 μžλ™μœΌλ‘œ μƒμ„±λœ κ°’μœΌλ‘œ μž¬μ •μ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이 λ†€λΌμš΄ 닡변에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€! λ„ˆ ꡉμž₯ν•˜λ‹€ :)

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