Autofixture: ๋ช…๋ น๋ฌธ์œผ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ๋žŒ๋‹ค๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ์ƒํ•œ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2018๋…„ 06์›” 07์ผ  ยท  2์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: AutoFixture/AutoFixture

๋‹ค์Œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            var fixture = new Fixture();
            fixture.Customize<PaymentReturnPayload>(c =>
            { // a statement lambda
                c.With(a => a.OperationAmount, "1");
                c.FromFactory(() => new PaymentReturnPayload(fixture.Create<int>().ToString()));
                return c;
            });
            var paymentReturnPayload = fixture.Create<PaymentReturnPayload>();
            Assert.True(int.TryParse(paymentReturnPayload.Control, out _));
        }
    }

    public class PaymentReturnPayload
    {
        public PaymentReturnPayload(string control)
        {
            Control = control;
        }

        public string OperationAmount { get; set; }

        public string Control
        {
            get;
        }
    }

Control ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ƒ์„ฑ๋œ int ๋Œ€์‹  ์ž„์˜์˜ ๋ฌธ์ž์—ด๋กœ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค.

๋ฒ„์ „ 4.0 - 4.4(์ด์ „ ๋ฒ„์ „์€ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Œ)
๋„คํŠธ ์ฝ”์–ด 2.0 - 2.1

์ด๊ฒƒ์€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค

[Fact]
        public void Test1()
        {
            var fixture = new Fixture();
            fixture.Customize<PaymentReturnPayload>(c =>
                c.FromFactory(() => new PaymentReturnPayload(fixture.Create<int>().ToString())));
            var paymentReturnPayload = fixture.Create<PaymentReturnPayload>();
            Assert.True(int.TryParse(paymentReturnPayload.Control, out _));
        }

๋žŒ๋‹ค๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.
์˜ˆ์ƒ๋œ ํ–‰๋™์ž…๋‹ˆ๊นŒ?
๊ทธ๋ ‡๋‹ค๋ฉด ์ผ๋ถ€ ๋ฌธ์„œ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋ญ๊ฐ€ ์ž˜๋ชป๋๋Š”์ง€ ์•Œ์•„๋‚ด๋Š๋ผ ์‹œ๊ฐ„์„ ๋งŽ์ด ํ—ˆ๋น„ํ–ˆ๋‹ค...

question

๋ชจ๋“  2 ๋Œ“๊ธ€

@progala2 ์งˆ๋ฌธ์„ ์˜ฌ๋ ค์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด ๋™์ž‘์€ ์˜๋„๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” FromFactory , With (๋ฐ Without ) ๋ฉ”์„œ๋“œ๊ฐ€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๊ธฐ๋ณธ ๊ฐœ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  ๊ตฌ์„ฑ๋œ ๊ทธ๋ž˜ํ”„์™€ ํ•จ๊ป˜ ์ƒˆ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ํ…Œ์ŠคํŠธ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„ ์ ์šฉ๋œ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์‚ญ์ œ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋ฉด ๋ช…๋ น๋ฌธ์—์„œ๋„ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

```c#
[์‚ฌ์‹ค]
๊ณต๊ฐœ ๋ฌดํšจ Test1()
{
var ๊ณ ์ • ์žฅ์น˜ = new Fixture();
์ •์ฐฉ๋ฌผ.์‚ฌ์šฉ์ž ์ •์˜(c =>
{
// ๋ฌธ ๋žŒ๋‹ค
var res = c.FromFactory(() => ์ƒˆ๋กœ์šด PaymentReturnPayload(fixture.Create)().ToString()));
res = res.With(a => a.OperationAmount, "1");
๋ฐ˜ํ™˜ ํ•ด์ƒ๋„;
});

var paymentReturnPayload = fixture.Create<PaymentReturnPayload>();
Assert.True(int.TryParse(paymentReturnPayload.Control, out _));

}


But as you might notice, it's easier to write this code with lambda.

P.S. By the way, you can slightly improve the final code (notice the `FromFactory` has overload taking extra values necessary for the object construction):
```c#
[Fact]
public void Test3()
{
    var fixture = new Fixture();
    fixture.Customize<PaymentReturnPayload>(c =>
        c.FromFactory((int control) => new PaymentReturnPayload(control.ToString())));

    var paymentReturnPayload = fixture.Create<PaymentReturnPayload>();
    Assert.True(int.TryParse(paymentReturnPayload.Control, out _));
}

๊ทธ๊ฒƒ๋“ค์€ ๋ถˆ๋ณ€์ž…๋‹ˆ๋‹ค. ์ด์ œ ํ›จ์”ฌ ๋ช…ํ™•ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.
๊ท€ํ•˜์˜ ๋‹ต๋ณ€๊ณผ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ํŒ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰