Autofixture: Customization ๊ธฐ๋ฐ˜ Random ์‹œํŽธ ์ƒ์„ฑ ๋ฐฉ์‹

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

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” ICustomization ์‚ฌ์šฉํ•˜์—ฌ ISpecimenBuilder.CreateMany ICustomization ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ ์œ ํ•œ ๊ฐ’์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. AutoFixture๊ฐ€ ๋ชจ๋“  ์—”ํ„ฐํ‹ฐ์— ๋Œ€ํ•ด ๋™์ผํ•œ ๊ฐ’์„ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์ตœ์ƒ์˜ ์†”๋ฃจ์…˜์ด ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ–ˆ์Šต๋‹ˆ๋‹ค.

```c#
๊ณต๊ฐœ ํด๋ž˜์Šค FooCustomization : ICustomization
{
public void ์ปค์Šคํ„ฐ๋งˆ์ด์ง•(IFixture ์กฐ๋ช…๊ธฐ)
{
var ํ‘œ๋ณธ = fixture.Build()
.OmitAutoProperties()
.With(x => x.CreationDate, DateTime.Now)
.With(x => x.Identifier, Guid.NewGuid().ToString().Substring(0, 6)) // ๊ณ ์œ ํ•œ ๊ฐ’์„ ์ƒ์„ฑํ•ด์•ผ ํ•จ
.With(x => x.Mail, $"[email protected]")
.์ฐฝ์กฐํ•˜๋‹ค();

        fixture.Register(() => specimen);
}

}
```

์ถ”์‹ .: ์ฃผ์š” ๋ชฉํ‘œ๋Š” ๋‚ด ํ…Œ์ŠคํŠธ์˜ ์ฝ”๋“œ ์–‘์„ ์ค„์ด๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋ชจ๋“  ํ…Œ์ŠคํŠธ์˜ ๊ฐ’์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด With() ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์—…๋ฐ์ดํŠธ: ๋ฐฉ๊ธˆ @ploeh ์—์„œ ์ด ์‘๋‹ต์„ https://github.com/AutoFixture/AutoFixture/issues/361#issuecomment -86873060 ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ฐพ๊ณ  ์žˆ๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ ‘๊ทผ ๋ฐฉ์‹์—๋Š” ๋งŽ์€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € Create<List<Foo>>() ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ง๊ด€์ ์ด์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด CreateMany<Foo> ์—์„œ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชฉ์ ์— ๋‹ค์†Œ ์–ด๊ธ‹๋‚˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜๋“œ ์ฝ”๋”ฉ ๋œ ํฌ๊ธฐ์˜ ๋ชฉ๋ก์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.>(?). ๋˜ ๋‹ค๋ฅธ ๋‹จ์ ์€ ๊ฐ ์—”ํ„ฐํ‹ฐ์— ๋Œ€ํ•ด ๋‘ ๊ฐ€์ง€ ์‚ฌ์šฉ์ž ์ง€์ •์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ์ปฌ๋ ‰์…˜์„ ๋งŒ๋“ค๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ปฌ๋ ‰์…˜์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด Create<T> ์˜ ๋™์ž‘์„ ์žฌ์ •์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

question

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

์ด๊ฒƒ์€ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์ข‹์€ ํ›„๋ณด์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์งˆ๋ฌธํ•˜๋Š” ๊ฒƒ์ด ์ž˜๋ชป๋œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ด ์งˆ๋ฌธ์€ ๋‹ต๋ณ€์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋„ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ์ข…๋ฅ˜์ด๊ณ  GitHub ๋ฌธ์ œ์— ๋น„ํ•ด Stack Overflow์—์„œ ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€์„ ์ฐพ๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Google์€ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์ธ๋ฑ์‹ฑ์„ ์ž˜ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ GitHub ๋ฌธ์ œ์˜ ์ˆœ์œ„๋Š” (๋‹ซํžŒ) ๋” ๋‚ฎ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค...

@ploeh ๊ณต๊ฐํ•ฉ๋‹ˆ๋‹ค....
๋ฐฉ๊ธˆ ์ด ๋ฌธ์ œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ SO ์งˆ๋ฌธ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ถ”ํ›„ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ๋งํฌ ์ž…๋‹ˆ๋‹ค ๐Ÿ‘

@ploeh SO :blush์— ๋Œ€ํ•œ ์งˆ๋ฌธ์— ๋‹ต๋ณ€ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@thiagomajesk ์‹ค์ œ๋กœ ์—ฌ๊ธฐ์— ์งˆ๋ฌธ์— ๋‹ตํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Mark๊ฐ€ SO๋ฅผ ์ œ์•ˆํ•œ ์ด์œ ๋Š” ๊ทธ๊ฒƒ์ด ์ œ๊ณตํ•˜๋Š” ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ํ˜„์žฌ Mark๋Š” SO๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๊ฑฐ๊ธฐ์— ์งˆ๋ฌธ์„ ๊ฒŒ์‹œํ•˜๋ฉด ๊ทธ์˜ ์ „๋ฌธ ์ง€์‹์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋” ๋งŽ์€ ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์ด๋ฒˆ์— ์–ป์€ ๊ฒƒ์ฒ˜๋Ÿผ) :sweat_smile:

@zvirja ์„ค๋ช… ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜„

@zvirja @ploeh ์˜ ํ›Œ๋ฅญํ•œ ๋‹ต๋ณ€์„ ๊ธฐ๋ฐ˜์œผ๋กœ SO์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ๋งˆ๋ฌด๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค .
ํ•˜์ง€๋งŒ ์ด์— ๋Œ€ํ•œ ๊ตฌํ˜„ ์„ธ๋ถ€ ์ •๋ณด์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์ฃผ์ œ์—์„œ ๋” ์ด์ƒ ๋ฒ—์–ด๋‚˜๊ณ  ์‹ถ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ ์ด ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ฌป๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š”์ด ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค :

```c#
๊ณต๊ฐœ ํด๋ž˜์Šค UniqueShortGuidBuilder: ISpecimenBuilder
{
๊ฐœ์ธ ์ฝ๊ธฐ ์ „์šฉ ๋ฌธ์ž์—ด propName;
๊ฐœ์ธ ์ฝ๊ธฐ ์ „์šฉ int ๊ธธ์ด;

public UniqueShortGuidBuilder(Expression<Func<TEntity, string>> expr, int lenght)
{
    propName = ((MemberExpression)expr.Body).Member.Name;
    this.lenght = lenght;
}

๊ณต์šฉ ๊ฐ์ฒด ์ƒ์„ฑ(๊ฐ์ฒด ์š”์ฒญ, ISpecimenContext ์ปจํ…์ŠคํŠธ)
{
var pi = PropertyInfo๋กœ ์š”์ฒญ;

if (pi == null || pi.PropertyType != typeof(string) || pi.Name != propName)
    return new NoSpecimen();

return Guid.NewGuid().ToString().Substring(0, lenght);

}
```

AutoFixture๋กœ ๋งŽ์€ ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ISpecimenBuilder.Create ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœ๋˜์–ด ๋‚ด ์—”ํ‹ฐํ‹ฐ์— ๋Œ€ํ•ด ๊ณ ์œ ํ•œ Guid๊ฐ€ ์ƒ์„ฑ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์€ ์‚ฌ์‹ค์ด ์•„๋‹ˆ๋ฉฐ ์‹ค์ œ๋กœ ๋™์ผํ•œ ๊ฒƒ์„ ๊ณต์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„์š”, ๋ฐฉ๊ธˆ ๊ท€ํ•˜์˜ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ •ํ™•ํ•˜๊ฒŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

```c#
๊ณต๊ฐœ ํด๋ž˜์Šค ํ‘ธ
{
๊ณต๊ฐœ ๋ฌธ์ž์—ด PropertyToCustomize { ๊ฐ€์ ธ์˜ค๊ธฐ; ์„ธํŠธ; }
}

๊ณต๊ฐœ ํด๋ž˜์Šค UniqueShortGuidBuilder: ISpecimenBuilder
{
๊ฐœ์ธ ์ฝ๊ธฐ ์ „์šฉ ๋ฌธ์ž์—ด propName;
๊ฐœ์ธ ์ฝ๊ธฐ ์ „์šฉ int ๊ธธ์ด;

public UniqueShortGuidBuilder(Expression<Func<TEntity, string>> expr, int lenght)
{
    propName = ((MemberExpression) expr.Body).Member.Name;
    this.lenght = lenght;
}

public object Create(object request, ISpecimenContext context)
{
    var pi = request as PropertyInfo;

    if (pi == null || pi.PropertyType != typeof(string) || pi.Name != propName)
        return new NoSpecimen();

    return Guid.NewGuid().ToString().Substring(0, lenght);
}

}

[์‚ฌ์‹ค]
๊ณต๊ฐœ ๋ฌดํšจ TestCustomization()
{
var ๊ณ ์ • ์žฅ์น˜ = new Fixture();
Fixture.Customizations.Add(new UniqueShortGuidBuilder(x => x.PropertyToCustomize, 5));

var manyFoos = fixture.CreateMany<Foo>(10);

var uniqueIds = manyFoos
    .Select(x => x.PropertyToCustomize)
    .Where(x => x.Length == 5)
    .Distinct()
    .ToArray();
Assert.Equal(10, uniqueIds.Length);

}
```

๋”ฐ๋ผ์„œ ์‹ค์ œ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ๋‹ค์‹œ ํ™•์ธํ•˜์—ฌ ๊ทธ ์ฐจ์ด๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Ÿ

@zvirja ์ด์ƒ
Fixture.Customize(new FooCustomization()); ํ•˜๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

```c#
์‹œ์Šคํ…œ ์‚ฌ์šฉ;
Microsoft.VisualStudio.TestTools.UnitTesting ์‚ฌ์šฉ;
AutoFixture.Kernel ์‚ฌ์šฉ;
System.Linq.Expressions ์‚ฌ์šฉ;
System.Reflection ์‚ฌ์šฉ;
AutoFixture ์‚ฌ์šฉ;
System.Linq๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ;

๋„ค์ž„์ŠคํŽ˜์ด์Šค UnitTestProject1
{
๊ณต๊ฐœ ํด๋ž˜์Šค ํ‘ธ
{
๊ณต๊ฐœ ๋ฌธ์ž์—ด PropertyToCustomize { ๊ฐ€์ ธ์˜ค๊ธฐ; ์„ธํŠธ; }
}

public class FooCustomization : ICustomization
{
    public void Customize(IFixture fixture)
    {
        var specimen = fixture.Build<Foo>()
            .OmitAutoProperties()
            .With(x => x.PropertyToCustomize)
            .Create();

        fixture.Register(() => specimen);
    }
}

public class UniqueShortGuidBuilder<TEntity> : ISpecimenBuilder
{
    private readonly string propName;
    private readonly int lenght;

    public UniqueShortGuidBuilder(Expression<Func<TEntity, string>> expr, int lenght)
    {
        propName = ((MemberExpression)expr.Body).Member.Name;
        this.lenght = lenght;
    }

    public object Create(object request, ISpecimenContext context)
    {
        var pi = request as PropertyInfo;

        if (pi == null || pi.PropertyType != typeof(string) || pi.Name != propName)
            return new NoSpecimen();

        return Guid.NewGuid().ToString().Substring(0, lenght);
    }
}

[TestClass]
public class UnitTest1
{
    public static Fixture Fixture { get; private set; }

    [ClassInitialize]
    public static void ClassInitialize(TestContext context)
    {
        Fixture = new Fixture();
        Fixture.Customizations.Add(new UniqueShortGuidBuilder<Foo>(x => x.PropertyToCustomize, 5));
        Fixture.Customize(new FooCustomization());
    }

    [TestMethod]
    public void TestMethod1()
    {
        var manyFoos = Fixture.CreateMany<Foo>(10);

        var uniqueIds = manyFoos
            .Select(x => x.PropertyToCustomize)
            .Where(x => x.Length == 5)
            .Distinct()
            .ToArray();

        Assert.AreEqual(10, uniqueIds.Length);
    }
}

}
```

๊ถŒ์žฅ ์‚ฌํ•ญ: GUID ๋ฌธ์ž์—ด์—์„œ ์ฒ˜์Œ _n_์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํด๋ž˜์Šค ์ด๋ฆ„์„ UniqueShortGuidBuilder ์ง€์ •ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ธธ์ด๊ฐ€ 5์ด๋ฉด ๊ฐ’์ด ์ƒ๋‹นํžˆ ๊ณ ์œ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ 1๋กœ ์„ค์ •ํ•˜๋ฉด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๊ณ ์œ ์„ฑ์€ ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด์˜ ๊ธธ์ด์™€ ๋ณด์žฅ๋˜์ง€ ์•Š์€ ๊ณ ์œ ์„ฑ์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด AutoFixture์— ์˜ˆ๋ฅผ ๋“ค์–ด 0์—์„œ 99,999 ์‚ฌ์ด์˜ ์ˆซ์ž๋ฅผ ์š”์ฒญํ•˜๊ณ  ์ด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ๋ฉด ์–ด๋–จ๊นŒ์š”? IIRC, ์ˆซ์ž๋Š” ๋ฒ”์œ„๊ฐ€ ์†Œ์ง„๋  ๋•Œ๊นŒ์ง€ ๊ณ ์œ ํ•ฉ๋‹ˆ๋‹ค.

Fixture.Customize(new FooCustomization()); ํ…Œ์ŠคํŠธ๋Š” ํ†ต๊ณผํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋ญ, ์‚ฌ์‹ค ์ƒํ™ฉ์„ ์ž˜ ์‚ดํŽด๋ณด์‹œ๋ฉด ์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™์ž…๋‹ˆ๋‹ค ๐Ÿ˜‚ #962 ์—์„œ ์ œ ๋‹ต๊ธ€ ์„ ๋ด์ฃผ์„ธ์š”. ์ œ๊ณต๋œ FooCustomization ๊ตฌํ˜„์€ Foo ์œ ํ˜•์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•ญ์ƒ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์กฐ๋ช…๊ธฐ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚˜์ค‘์— Foo ์œ ํ˜•์˜ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ๋™์ผํ•œ ๊ฐœ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ณ  ๋นŒ๋”๊ฐ€ ๋” ์ด์ƒ ํ˜ธ์ถœ๋˜์ง€ ์•Š์„ ๋•Œ๋งˆ๋‹ค.

Foo ๋ฅผ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์—ฌ๊ธฐ์—์„œ ์ œ์•ˆํ•œ ๋Œ€๋กœ Customize<> API๋ฅผ ์‚ฌ์šฉ ํ•˜์‹ญ์‹œ์˜ค .

@ploeh ํŒ์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ์ฝ”๋“œ๋Š” ํ…Œ์ŠคํŠธ ๋ชฉ์ ์„ ์œ„ํ•œ ์ด์ฒด์ ์ธ ์˜ˆ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ๊ฒฝ์šฐ ๊ธธ์ด๋Š” Guids์˜ ๊ณ ์œ ์„ฑ์— ์˜ํ–ฅ์„ ์ค„ ์ •๋„๋กœ ์งง์ง€ ์•Š์Šต๋‹ˆ๋‹ค ๐Ÿ˜„.

๋ฌธ์ž์—ด์˜ ๊ธธ์ด์™€ ๋ณด์žฅ๋˜์ง€ ์•Š์€ ๊ณ ์œ ์„ฑ์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด AutoFixture์— ์˜ˆ๋ฅผ ๋“ค์–ด 0์—์„œ 99,999 ์‚ฌ์ด์˜ ์ˆซ์ž๋ฅผ ์š”์ฒญํ•˜๊ณ  ์ด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ๋ฉด ์–ด๋–จ๊นŒ์š”?

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— ์ข‹์€ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ ๋‚ด ์‹œ์Šคํ…œ์˜ ์˜์ˆซ์ž ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋•Œ๋ฌธ์— ์ด ํŠน์ •ํ•œ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋„ ํ•ด๋‹น ํ•„๋“œ์™€ ๊ด€๋ จ๋œ ๋” ๋ณต์žกํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„์š”, ์‚ฌ์‹ค ์ƒํ™ฉ์„ ์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด ์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™์ž…๋‹ˆ๋‹ค.

@zvirja #962์—์„œ ๋‹ต์žฅ์„ ์—ฌ๊ธฐ์„œ ์ง€์ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ) ๊ทธ ํ–‰๋™์ด ๋ถ„๋ช…ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๐Ÿ˜.

๋งˆ๋ฌด๋ฆฌ๋กœ ์ธ๋‚ด์‹ฌ๊ณผ ๋ชจ๋“  ํ›Œ๋ฅญํ•œ ์„ค๋ช…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ฏธ๋ž˜์— ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋„ ์œ ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜‰.

์ข‹์•„, ์ถฉ๋ถ„ํžˆ ๊ณตํ‰ํ•˜๊ฒŒ, ๋‚˜๋Š” ์ผ์„ ๋„ˆ๋ฌด ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๋ฐ›์•„๋“ค์ด๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์„์ง€๋„ ๋ชจ๋ฅธ๋‹ค ๐Ÿ˜„

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