Autofixture: μˆœν™˜ μ°Έμ‘°μ—μ„œ μ‚¬μš©μž 지정 μΈμŠ€ν„΄μŠ€ λΉŒλ“œ μ‹€νŒ¨

에 λ§Œλ“  2018λ…„ 01μ›” 13일  Β·  5μ½”λ©˜νŠΈ  Β·  좜처: AutoFixture/AutoFixture

    [TestFixture]
    public class TestAutoFixture4
    {
        [Test]
        [AutoMoqData]
        public void CreatingAnDummyObjectShouldNotThrow(IFixture fixture)
        {
            fixture.Invoking(x => x.Create<DummyObject>()).ShouldNotThrow();
        }

        [Test]
        [AutoMoqData]
        public void BuildingAnDummyObjectShouldNotThrow(IFixture fixture)
        {
            fixture.Invoking(x => x.Build<DummyObject>().Create()).ShouldNotThrow();
        }
    }

    public class DummyObject
    {
        public Guid Id { get; set; }
        public DummyObject CircularRef { get; set; }
    }

    public class AutoMoqDataAttribute : AutoDataAttribute
    {
        public AutoMoqDataAttribute()
            : base(new Fixture()
                 .Customize(
                    new DummyCustomization()
                ))
        { }
    }

    public class DummyCustomization : ICustomization
    {
        public void Customize(IFixture fixture)
        {
            fixture.Customize<DummyObject>(c =>
                c.Without(x => x.CircularRef)
            );
        }
    }

AutoFixtureλ₯Ό 3.50.6μ—μ„œ 4.0.0으둜 μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€.

μœ„μ˜ μ½”λ“œλŠ” 3.50.6μ—μ„œ μ™„λ²½ν•˜κ²Œ μž‘λ™ν•˜μ§€λ§Œ 첫 번째 ν…ŒμŠ€νŠΈ(fixture.Create μ‚¬μš©)만 4.0.0(.NET 4.6.2, NUnit3.7.1, FluentAssertions 4.19.4)을 μ‚¬μš©ν•˜μ—¬ ν†΅κ³Όν•©λ‹ˆλ‹€.

μ£Όμž…λœ μ‚¬μš©μž 지정이 μˆœν™˜ μ°Έμ‘°λ₯Ό ν™•μΈν•˜μ§€ μ•Šλ„λ‘ μ§€μ •ν•˜λ”λΌλ„ fixture.Buildλ₯Ό μ‚¬μš©ν•˜λŠ” ν…ŒμŠ€νŠΈλŠ” μ‹€νŒ¨ν•©λ‹ˆλ‹€.

λ³€κ²½ λ‘œκ·Έμ—μ„œ λˆ„λ½λœ 것이 μžˆμŠ΅λ‹ˆκΉŒ μ•„λ‹ˆλ©΄ λ²„κ·Έμž…λ‹ˆκΉŒ?

미리 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€ :)

question

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

Omitter μ ‘κ·Ό 방식이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€κ³  μƒκ°ν•˜μ‹­λ‹ˆκΉŒ? λ‚˜λŠ” 이 μˆ˜μ—…μ„ λͺ°λžκ³  μ–΄μ¨Œλ“  ν™•μ‹€νžˆ μ‹œλ„ν•  κ²ƒμž…λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같이 μ‚¬μš©μž μ •μ˜λ₯Ό λ‹€μ‹œ μž‘μ„±ν•˜λ©΄ λͺ¨λ“  ν…ŒμŠ€νŠΈκ°€ ν†΅κ³Όν•˜κΈ° μ‹œμž‘ν•©λ‹ˆλ‹€.

c# public class DummyCustomization : ICustomization { public void Customize(IFixture fixture) { // Don't populate the DummyObject.CircularRef property. fixture.Customizations.Add( new Omitter( new EqualRequestSpecification( typeof(DummyObject).GetProperty(nameof(DummyObject.CircularRef))))); } }

λ”°λΌμ„œ λ„€, 문제λ₯Ό ν•΄κ²°ν•΄μ•Ό ν•©λ‹ˆλ‹€ πŸ˜‰ λ˜ν•œ 이 μ ‘κ·Ό 방식은 λ„ˆλ¬΄ λ³΅μž‘ν•΄ 보이지 μ•ŠμœΌλ―€λ‘œ 수용 κ°€λŠ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ§ˆλ¬Έμ— λŒ€ν•΄ μΆ”κ°€ 질문이 있으면 μ•Œλ €μ£Όμ„Έμš”.

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

@Dev-I-Ant 여기에 문제λ₯Ό κ²Œμ‹œν•˜κ³  μžμ„Έν•œ μ„€λͺ…을 ν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€ πŸ‘

이 λ™μž‘μ€ #781에 적용된 λ³€κ²½ μ‚¬ν•­μ˜ κ²°κ³Όμž…λ‹ˆλ‹€. ν•˜λ‚˜μ˜ μ‚¬μš©μž 지정이 λ‹€λ₯Έ μ‚¬μš©μž 지정에 영ν–₯을 쀄 수 μžˆλŠ” 문제λ₯Ό μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” λ™μΌν•œ μœ ν˜•μ— λŒ€ν•΄ 두 개의 후속 μ‚¬μš©μž μ •μ˜κ°€ μžˆλŠ” κ²½μš°μ—λ„ λ°œμƒν•©λ‹ˆλ‹€. 이전 μ‚¬μš©μž μ •μ˜λŠ” μ™„μ „νžˆ λ¬΄μ‹œλ©λ‹ˆλ‹€.

Build<T>() APIλ₯Ό μ‚¬μš©ν•˜λ©΄ μ‹€μ œλ‘œ DummyObject μœ ν˜•μ— λŒ€ν•œ μž„μ‹œ μ‚¬μš©μž 지정을 μƒμ„±ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 즉, μ΄μ „μ˜ λͺ¨λ“  μ‚¬μš©μž μ •μ˜( Customize<DummyObject>() APIλ₯Ό 톡해 적용됨)κ°€ λ¬΄μ‹œλ˜κ³  μ°Έμ—¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이것이 μˆœν™˜ 쒅속성에 λŒ€ν•œ 였λ₯˜κ°€ λ‹€μ‹œ ν‘œμ‹œλ˜λŠ” μ΄μœ μž…λ‹ˆλ‹€.

μ΄λŸ¬ν•œ μ’…λ₯˜μ˜ 격리가 ν•„μš”ν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ 맀우 μ΄μƒν•œ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€(μœ„μ— μ–ΈκΈ‰λœ PRμ—μ„œ 참쑰된 문제 μ°Έμ‘°). λ”°λΌμ„œ 일을 λ‹¨μˆœν•˜κ²Œ μœ μ§€ν•˜κΈ° μœ„ν•΄ κ΄€μ°°λœ λ™μž‘μ€ 버그가 μ•„λ‹ˆλΌ ν˜„μž¬ 가지고 μžˆλŠ” λ””μžμΈμ˜ νŠΉμˆ˜μ„±μ΄λΌκ³  λ§ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.


κ΄€μ°°ν•œ 문제λ₯Ό μ™„ν™”ν•˜κΈ° μœ„ν•΄ 기본적으둜 두 가지 방법이 μžˆμŠ΅λ‹ˆλ‹€.

ν•΄κ²° 방법 1: 속성에 Omitter μΆ”κ°€

μš°λ¦¬λŠ” 이미 λΉ„μŠ·ν•œ μ§ˆλ¬Έμ„ λ°›μ•˜μœΌλ―€λ‘œ 여기에 μ œμ•ˆλœ μ ‘κ·Ό 방식을 μž¬μ‚¬μš©ν•˜κ±°λ‚˜ ν•„μš”μ— 더 잘 λ§žλ„λ‘ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λΆ„λͺ…νžˆ 이것이 ν”„λ‘œμ νŠΈμ˜ 일반적인 μ‹œλ‚˜λ¦¬μ˜€λΌλ©΄ ν™•μž₯ λ©”μ„œλ“œλ₯Ό λ§Œλ“€μ–΄ μž‘μ—…μ„ 더 μ‰½κ²Œ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•΄κ²° 방법 2: λŒ€μ‹  Create<T>() API μ‚¬μš©

μƒ˜ν”Œμ—μ„œλŠ” Build<> APIλ₯Ό μ‚¬μš©ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. λ¬Όλ‘  λ‹¨μˆœν™”λœ μƒ˜ν”Œμ„ μ œκ³΅ν–ˆκ³  μ‹€μ œλ‘œ ν•΄λ‹Ή APIκ°€ ν•„μš”ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ§ŒμΌμ„ λŒ€λΉ„ν•˜μ—¬ 이 μ˜΅μ…˜μ„ μ œκ³΅ν•˜κΈ°λ‘œ κ²°μ •ν–ˆμŠ΅λ‹ˆλ‹€ πŸ˜ƒ

λ‚΄ 닡변이 이 λ¬Έμ œμ— λŒ€ν•œ 정보λ₯Ό μ œκ³΅ν•˜λŠ” 데 도움이 λ˜μ—ˆλŠ”μ§€ μ•Œλ €μ£Όμ„Έμš” πŸ˜‰

@zvirja 톡찰λ ₯ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. 이것은 상황을 더 λͺ…ν™•ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€.

λ‚˜λŠ” 이미 같은 μœ ν˜•μ— μ‚¬μš©μž μ •μ˜λ₯Ό μŒ“λŠ” 것이 λΆˆκ°€λŠ₯ν•˜λ‹€λŠ” 사싀에 λŒ€ν•΄ 많이 μ½μ—ˆκ³ (비둝 μ‹€λ§μŠ€λŸ½λ”λΌλ„) 이 λ³€κ²½μœΌλ‘œ 인해 ν™•μ‹€νžˆ μ•½κ°„μ˜ λ¬Έμ œκ°€ λ°œμƒν•˜μ§€λ§Œ μ™œ 무언가λ₯Ό λ³€κ²½ν•΄μ•Ό ν•˜λŠ”μ§€ μ΄ν•΄ν•©λ‹ˆλ‹€.

λ‚΄ μ‚¬μš© μ‚¬λ‘€λŠ” λ§Žμ€ μˆœν™˜ μ°Έμ‘°κ°€ μžˆλŠ” 큰 개체 κ·Έλž˜ν”„λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‘μš© ν”„λ‘œκ·Έλž¨μ„ ν…ŒμŠ€νŠΈν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. λΆ€λͺ¨κ°€ μžμ‹ λͺ©λ‘μ„ λ³΄μœ ν•˜κ³  μ°¨λ‘€λ‘œ λΆ€λͺ¨λ₯Ό μ°Έμ‘°ν•˜λŠ” μ „ν˜•μ μΈ (반?) νŒ¨ν„΄μž…λ‹ˆλ‹€.

λͺ¨λΈμ„ λ³€κ²½ν•˜κ³  μ‹Άμ§€λ§Œ ν˜„μž¬λ‘œμ„œλŠ” λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ λ‹¨μˆœνžˆ fixture.Createλ₯Ό μ‚¬μš©ν•˜μ—¬ 객체λ₯Ό μƒμ„±ν•˜λŠ” 것은 μ˜΅μ…˜μ΄ μ•„λ‹ˆλ©° 일반적으둜 직후에 OmitAllPropertiesλ₯Ό ν˜ΈμΆœν•˜μ—¬ 객체λ₯Ό λΉŒλ“œν•˜λ―€λ‘œ AF의 μ„±λŠ₯이 μ œν•œλ©λ‹ˆλ‹€.

κ·Έλž˜μ„œ μ €λŠ” μˆœν™˜ μ°Έμ‘°λ₯Ό μƒλž΅ν•˜κ³  이λ₯Ό μ²˜λ¦¬ν•˜λŠ” λͺ‡ 가지 μ‚¬μš©μž μ •μ˜λ₯Ό λ§Œλ“€κ³€ ν–ˆμŠ΅λ‹ˆλ‹€(그런 λ‹€μŒ κ°œλ°œμžλŠ” μˆœν™˜ μ°Έμ‘°κ°€ μžˆλŠ”μ§€ 여뢀에 신경쓰지 μ•Šκ³  개체λ₯Ό λΉŒλ“œν•˜κ³  Withλ₯Ό μ‚¬μš©ν•˜μ—¬ μΆ”κ°€λ‘œ μ‚¬μš©μž μ •μ˜ν•  수 μžˆμ–΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. 없이 λ“±λ“±). κ·ΈλŸ¬λ‚˜ μ΄λŸ¬ν•œ λ³€ν™”λŠ” 이 λͺ¨λ“  것을 κΉ¨λœ¨λ¦½λ‹ˆλ‹€.
Omitter μ ‘κ·Ό 방식이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€κ³  μƒκ°ν•˜μ‹­λ‹ˆκΉŒ? λ‚˜λŠ” 이 μˆ˜μ—…μ„ λͺ°λžκ³  μ–΄μ¨Œλ“  ν™•μ‹€νžˆ μ‹œλ„ν•  κ²ƒμž…λ‹ˆλ‹€.

λ‹€μ‹œ ν•œ 번 κ°μ‚¬λ“œλ¦¬λ©°, 제 생각에 μΆ”κ°€ν•  수 μžˆλŠ” λ‚΄μš©μ΄ 있으면 μ•Œλ €μ£Όμ„Έμš”.

Omitter μ ‘κ·Ό 방식이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€κ³  μƒκ°ν•˜μ‹­λ‹ˆκΉŒ? λ‚˜λŠ” 이 μˆ˜μ—…μ„ λͺ°λžκ³  μ–΄μ¨Œλ“  ν™•μ‹€νžˆ μ‹œλ„ν•  κ²ƒμž…λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같이 μ‚¬μš©μž μ •μ˜λ₯Ό λ‹€μ‹œ μž‘μ„±ν•˜λ©΄ λͺ¨λ“  ν…ŒμŠ€νŠΈκ°€ ν†΅κ³Όν•˜κΈ° μ‹œμž‘ν•©λ‹ˆλ‹€.

c# public class DummyCustomization : ICustomization { public void Customize(IFixture fixture) { // Don't populate the DummyObject.CircularRef property. fixture.Customizations.Add( new Omitter( new EqualRequestSpecification( typeof(DummyObject).GetProperty(nameof(DummyObject.CircularRef))))); } }

λ”°λΌμ„œ λ„€, 문제λ₯Ό ν•΄κ²°ν•΄μ•Ό ν•©λ‹ˆλ‹€ πŸ˜‰ λ˜ν•œ 이 μ ‘κ·Ό 방식은 λ„ˆλ¬΄ λ³΅μž‘ν•΄ 보이지 μ•ŠμœΌλ―€λ‘œ 수용 κ°€λŠ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ§ˆλ¬Έμ— λŒ€ν•΄ μΆ”κ°€ 질문이 있으면 μ•Œλ €μ£Όμ„Έμš”.

이것은 μ™„λ²½ν•˜κ²Œ μž‘λ™ν•©λ‹ˆλ‹€. 정말 κ°μ‚¬ν•©λ‹ˆλ‹€! λ‹«μœΌμ‹œλ©΄ 될 것 κ°™μ•„μš” :)

@Dev-I-Ant Awesome, ν”Όλ“œλ°± μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! :)

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