Autofixture: λ³΅μž‘ν•œ μ œμ•½ 쑰건이 μžˆλŠ” 객체 생성

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

AutoFixtureκ°€ μƒμ„±μžμ— μ‚¬μ†Œν•œ μ œμ•½ 쑰건이 μžˆλŠ” 개체λ₯Ό μƒμ„±ν•˜λ„λ‘ ν•˜λŠ” κ°€μž₯ 쒋은 방법을 μ•Œμ•„ λ‚΄λ €κ³  λ…Έλ ₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ •μˆ˜λ₯Ό μ·¨ν•˜κ³  μ†Œμˆ˜λ§Œ λ°›μ•„λ“€μ΄λŠ” PrimeNumber 데이터 ꡬ쑰λ₯Ό μ‚¬μš©ν•˜κ³  μ‹Άλ‹€κ³  κ°€μ •ν•΄ λ΄…μ‹œλ‹€.

AutoFixtureμ—μ„œ μ΄λŸ¬ν•œ μ’…λ₯˜μ˜ ꡬ쑰 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” κ°€μž₯ 쒋은 방법은 λ¬΄μ—‡μž…λ‹ˆκΉŒ? λ‚΄ 말은, λ‚˜λŠ” λΆ„λͺ…νžˆ μ‚¬μš©μž μ •μ˜λ₯Ό μž‘μ„±ν•  κ²ƒμ΄μ§€λ§Œ 거기에 무엇을 넣을 κ²ƒμž…λ‹ˆκΉŒ?

  • μž„μ˜μ˜ μ •μˆ˜λ₯Ό μƒμ„±ν•˜κ³  κ·Έ 쀑 ν•˜λ‚˜κ°€ μ†Œμˆ˜κ°€ 될 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ(λ˜λŠ” μ†Œμˆ˜ 생성 μ•Œκ³ λ¦¬μ¦˜μ„ λ‹Ήμ—°νžˆ μ‹€ν–‰)? 이런 μ’…λ₯˜μ˜ μ œμ•½ μ‘°κ±΄μ—μ„œλŠ” ν—ˆμš©λ  수 μžˆμ§€λ§Œ μ œμ•½ 쑰건을 μ€€μˆ˜ν•˜κΈ°κ°€ 더 κΉŒλ‹€λ‘­λ‹€λ©΄ λΉ„μš©μ΄ λΉ λ₯΄κ²Œ λ“€ κ²ƒμž…λ‹ˆλ‹€.
  • ν—ˆμš© κ°€λŠ₯ν•œ κ°’μ˜ μœ ν•œ λͺ©λ‘μ„ μ œκ³΅ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

λ˜ν•œ, 이둠적으둜 κ°œλ³„μ μœΌλ‘œ μž„μ˜μ μΌ 수 μžˆλŠ” μ—¬λŸ¬ 인수λ₯Ό μ·¨ν•˜λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€λ €κ³  ν•œλ‹€κ³  κ°€μ •ν•΄ λ΄…μ‹œλ‹€. true이고 argCλŠ” argA 값에 따라 λ‹€λ₯Έ μœ νš¨μ„± 검사 κ·œμΉ™μ„ μ€€μˆ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ argC.X 속성이 argA.X 속성과 μΌμΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

이 경우 μ–΄λ–»κ²Œ ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

  • 각 μœ ν˜•μ˜ μœ νš¨ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ μ‚¬μš©μž μ •μ˜(μ™ΈλΆ€ μœ νš¨μ„± 검사에 μ‹ κ²½ 쓰지 μ•Šκ³ )와 μœ νš¨ν•œ μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•˜λ©΄μ„œ 크고 λ³΅μž‘ν•œ 개체λ₯Ό μƒμ„±ν•˜λ €κ³  μ‹œλ„ν•˜λŠ” λ‹€λ₯Έ μ‚¬μš©μž μ •μ˜?
  • λ‹€μ‹œ λ§ν•˜μ§€λ§Œ, ν—ˆμš© κ°€λŠ₯ν•œ μœ ν•œ κ°’ λͺ©λ‘μ„ μ œκ³΅ν•˜μ‹­μ‹œμ˜€. μ΄λŠ” κ°€λŠ₯μ„±μ˜ 진폭에 μ‹¬κ°ν•œ μ œν•œμ΄ 될 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ³΅μž‘ν•œ 개체의 μœ νš¨μ„± 검사에 λ§žλŠ” 인수의 μΈμŠ€ν„΄μŠ€λ§Œ μƒμ„±ν•˜λŠ” νŠΉλ³„ν•œ μ‚¬μš©μž 지정을 μ œκ³΅ν•©λ‹ˆλ‹€.

그리고 λ§ˆμ§€λ§‰μœΌλ‘œ(λͺ‡ 가지 문제λ₯Ό λ§Œλ“€ μˆ˜λ„ μžˆμ—ˆμ§€λ§Œ λͺ¨λ“  μ£Όμ œκ°€ 같은 문제의 λ‹€λ₯Έ 츑면이라고 λŠκΌˆμŠ΅λ‹ˆλ‹€) μƒˆ 클래슀λ₯Ό μΆ”κ°€ν•  λ•Œλ§ˆλ‹€ μ΄λŸ¬ν•œ μ’…λ₯˜μ˜ μ‚¬μš©μž 지정을 λ§Œλ“€κ³  μ μš©ν•΄μ•Ό ν•˜κ³  μœ νš¨μ„± 검사 κ·œμΉ™ 변경은 λ§Žμ€ μž‘μ—…μ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€. 이λ₯Ό μ™„ν™”ν•˜κΈ° μœ„ν•΄ λͺ‡ 가지 κΈ°μˆ μ„ μ μš©ν•©λ‹ˆκΉŒ?

λ„ˆλ¬΄ κ°μ‚¬ν•©λ‹ˆλ‹€. κΈ΄ μ‹œκ°„ λ™μ•ˆ μ£„μ†‘ν•©λ‹ˆλ‹€. λ„ˆλ¬΄ μ§€μ €λΆ„ν•œ κ²Œμ‹œλ¬Όμ΄ μ•„λ‹ˆκΈΈ λ°”λžλ‹ˆλ‹€.

question

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

μ•ˆλ…•ν•˜μ„Έμš”! λ§ˆμ§€λ§‰μœΌλ‘œ 닡변을 μœ„ν•΄ μ•½κ°„μ˜ μœ ν˜•μ„ ν• λ‹Ήν–ˆμŠ΅λ‹ˆλ‹€. 닡변이 λ„ˆλ¬΄ λŠ¦μ–΄μ„œ μ£„μ†‘ν•©λ‹ˆλ‹€ 😊

μš°μ„  AutoFixture의 핡심은 맀우 κ°„λ‹¨ν•˜λ©° μ œμ•½ 쑰건이 μžˆλŠ” λ³΅μž‘ν•œ νŠΈλ¦¬μ— λŒ€ν•œ κΈ°λ³Έ 제곡 지원이 μ—†λ‹€λŠ” 점에 μœ μ˜ν•˜μ‹­μ‹œμ˜€. κ°„λ‹¨νžˆ λ§ν•΄μ„œ 생성 μ „λž΅μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • 곡용 μƒμ„±μž λ˜λŠ” 정적 νŒ©ν† λ¦¬ λ©”μ†Œλ“œ(ν˜„μž¬ μœ ν˜•μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ¦¬ν„΄ν•˜λŠ” 정적 λ©”μ†Œλ“œ)λ₯Ό μ°ΎμœΌμ‹­μ‹œμ˜€.
  • μƒμ„±μž 인수λ₯Ό ν•΄κ²°ν•˜κ³  μΈμŠ€ν„΄μŠ€λ₯Ό ν™œμ„±ν™”ν•©λ‹ˆλ‹€.
  • μ“°κΈ° κ°€λŠ₯ν•œ 곡용 속성과 ν•„λ“œλ₯Ό μƒμ„±λœ κ°’μœΌλ‘œ μ±„μ›λ‹ˆλ‹€.

ν˜„μž¬ μ ‘κ·Ό 방식을 μ‚¬μš©ν•˜λ©΄ 이전에 λ°œκ²¬ν•œ κ²ƒμ²˜λŸΌ 쒅속성 μ œμ•½ 쑰건을 μ–΄λ–»κ²Œλ“  μ œμ–΄ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

νŠΉμ • μœ ν˜•μ„ λΉŒλ“œν•˜λŠ” 방법을 μ§€μ •ν•˜κΈ° μœ„ν•œ λͺ‡ 가지 μ‚¬μš©μž 지정 지점이 μžˆμ§€λ§Œ μƒλŒ€μ μœΌλ‘œ κ°„λ‹¨ν•˜κ³  λ³΅μž‘ν•œ κ·œμΉ™μ„ μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

AutoFixtureμ—μ„œ μ΄λŸ¬ν•œ μ’…λ₯˜μ˜ ꡬ쑰 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” κ°€μž₯ 쒋은 방법은 λ¬΄μ—‡μž…λ‹ˆκΉŒ? λ‚΄ 말은, λ‚˜λŠ” λΆ„λͺ…νžˆ μ‚¬μš©μž μ •μ˜λ₯Ό μž‘μ„±ν•  κ²ƒμ΄μ§€λ§Œ 거기에 무엇을 넣을 κ²ƒμž…λ‹ˆκΉŒ?

  • μž„μ˜μ˜ μ •μˆ˜λ₯Ό μƒμ„±ν•˜κ³  κ·Έ 쀑 ν•˜λ‚˜κ°€ μ†Œμˆ˜κ°€ 될 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ(λ˜λŠ” μ†Œμˆ˜ 생성 μ•Œκ³ λ¦¬μ¦˜μ„ λ‹Ήμ—°νžˆ μ‹€ν–‰)? 이런 μ’…λ₯˜μ˜ μ œμ•½ μ‘°κ±΄μ—μ„œλŠ” ν—ˆμš©λ  수 μžˆμ§€λ§Œ μ œμ•½ 쑰건을 μ€€μˆ˜ν•˜κΈ°κ°€ 더 κΉŒλ‹€λ‘­λ‹€λ©΄ λΉ„μš©μ΄ λΉ λ₯΄κ²Œ λ“€ κ²ƒμž…λ‹ˆλ‹€.

  • ν—ˆμš© κ°€λŠ₯ν•œ κ°’μ˜ μœ ν•œ λͺ©λ‘μ„ μ œκ³΅ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

κΈ€μŽ„, λΆˆν–‰νžˆλ„ λ‚˜λŠ” 여기에 은색 μ΄μ•Œμ΄ 보이지 μ•ŠμœΌλ©° μ ‘κ·Ό 방식은 상황에 따라 λ‹€λ¦…λ‹ˆλ‹€. 값에 λ„ˆλ¬΄ λ¬΄μž‘μœ„λ‘œ μ˜μ‘΄ν•˜μ§€ μ•Šκ±°λ‚˜ 단일 SUTκ°€ 1-2개의 μ†Œμˆ˜λ§Œ μ‚¬μš©ν•˜λŠ” 경우 μ†Œμˆ˜λ₯Ό ν•˜λ“œμ½”λ”©ν•˜κ³  μ†Œμˆ˜ μ€‘μ—μ„œ μ„ νƒν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€( ElementsBulider<> λ‚΄μž₯ λ„μš°λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬ν•œ 경우). λ°˜λ©΄μ— λ§Žμ€ μ†Œμˆ˜ λͺ©λ‘μ΄ ν•„μš”ν•˜κ³  κΈ΄ μ†Œμˆ˜ μ‹œν€€μŠ€λ‘œ μž‘μ—…ν•˜λŠ” 경우 λ™μ μœΌλ‘œ μƒμ„±ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μ½”λ”©ν•˜λŠ” 것이 더 λ‚˜μ„ κ²ƒμž…λ‹ˆλ‹€.

λ˜ν•œ, 이둠적으둜 κ°œλ³„μ μœΌλ‘œ μž„μ˜μ μΌ 수 μžˆλŠ” μ—¬λŸ¬ 인수λ₯Ό μ·¨ν•˜λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€λ €κ³  ν•œλ‹€κ³  κ°€μ •ν•΄ λ΄…μ‹œλ‹€. true이고 argCλŠ” argA 값에 따라 λ‹€λ₯Έ μœ νš¨μ„± 검사 κ·œμΉ™μ„ μ€€μˆ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ argC.X 속성이 argA.X 속성과 μΌμΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

이 경우 μ–΄λ–»κ²Œ ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

정말 쒋은 질문이고 λΆˆν–‰νžˆλ„ AutoFixtureλŠ” μƒμžμ—μ„œ κΊΌλ‚΄λŠ” 쒋은 λ°©λ²•μœΌλ‘œ 문제λ₯Ό ν•΄κ²°ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 일반적으둜 각 μœ ν˜•μ— λŒ€ν•œ μ‚¬μš©μž μ •μ˜λ₯Ό λΆ„λ¦¬ν•˜λ €κ³  ν•˜λ―€λ‘œ ν•œ μœ ν˜•μ— λŒ€ν•œ μ‚¬μš©μž μ •μ˜λŠ” 단일 μœ ν˜•μ— λŒ€ν•œ μƒμ„±λ§Œ μ œμ–΄ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 제 κ²½μš°μ—λŠ” μœ ν˜•μ΄ 독립적이며 λΆ„λͺ…νžˆ κ·€ν•˜μ˜ κ²½μš°μ—λŠ” 잘 μž‘λ™ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€. λ˜ν•œ AutoFixtureλŠ” 기본적으둜 μ»¨ν…μŠ€νŠΈλ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ νŠΉμ • μœ ν˜•μ— λŒ€ν•œ μ‚¬μš©μž μ •μ˜λ₯Ό μž‘μ„±ν•  λ•Œ 개체(λ‚΄λΆ€μ μœΌλ‘œ ν‘œλ³Έμ΄λΌκ³  함)λ₯Ό μƒμ„±ν•˜λŠ” μ»¨ν…μŠ€νŠΈλ₯Ό λͺ…ν™•ν•˜κ²Œ 이해할 수 μ—†μŠ΅λ‹ˆλ‹€.

λ‚΄ 머리 μœ„μ—, λ‚˜λŠ” 일반적으둜 λ‹€μŒκ³Ό 같은 μ „λž΅μ„ μΆ”μ²œν•  것이라고 λ§ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

  • 단일 개체 μœ ν˜•μ˜ μƒμ„±λ§Œ μ œμ–΄ν•˜λŠ” β€‹β€‹λ°©μ‹μœΌλ‘œ 각 μœ ν˜•μ— λŒ€ν•œ μ‚¬μš©μž μ •μ˜λ₯Ό 생성해 λ³΄μ‹­μ‹œμ˜€.
  • νŠΉμ • μ œμ•½ 쑰건이 μžˆλŠ” 쒅속성을 λ§Œλ“€μ–΄μ•Ό ν•˜λŠ” 경우 μ‚¬μš©μž μ§€μ •μ—μ„œλ„ ν•΄λ‹Ή 쒅속성을 ν™œμ„±ν™”ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. 쒅속성이 λ³€κ²½ κ°€λŠ₯ν•œ 경우 AutoFixture에 쒅속성을 μƒμ„±ν•˜λ„λ‘ μš”μ²­ν•˜κ³  λ‚˜μ€‘μ— ν˜Έν™˜λ˜λŠ” λ°©μ‹μœΌλ‘œ ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λ ‡κ²Œ ν•˜λ©΄ λ‚΄λΆ€ μ•„ν‚€ν…μ²˜μ™€ λ„ˆλ¬΄ 많이 λͺ¨μˆœλ˜μ§€ μ•Šκ³  μž‘λ™ 방식이 λͺ…ν™•ν•΄μ§‘λ‹ˆλ‹€. λ¬Όλ‘  잠재적으둜 이 방법은 맀우 μž₯ν™©ν•©λ‹ˆλ‹€.

λ³΅μž‘ν•œ μ œμ•½ 쑰건이 μžˆλŠ” κ²½μš°κ°€ ν”ν•˜μ§€ μ•Šμ€ 경우 κΈ°μ‘΄ κΈ°λŠ₯으둜 μΆ©λΆ„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 도메인 λͺ¨λΈμ΄ μ΄λŸ¬ν•œ 경우둜 가득 μ°¨ μžˆλ‹€λ©΄ μ†”μ§νžˆ AutoFixtureκ°€ 졜고의 도ꡬ가 아닐 수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λ§ˆλ„ μ‹œμž₯μ—λŠ” μ΄λŸ¬ν•œ 문제λ₯Ό κ°€μž₯ μš°μ•„ν•œ λ°©μ‹μœΌλ‘œ ν•΄κ²°ν•  수 μžˆλŠ” 더 λ‚˜μ€ 도ꡬ가 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€. λ¬Όλ‘  AutoFixtureκ°€ 맀우 μœ μ—°ν•˜κ³  거의 λͺ¨λ“  것을 μž¬μ •μ˜ν•  수 μžˆμœΌλ―€λ‘œ AutoFixture μ½”μ–΄ μœ„μ— 항상 κ³ μœ ν•œ DSL을 생성할 수 μžˆλ‹€λŠ” 점을 μ–ΈκΈ‰ν•  κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€... ν•˜μ§€λ§Œ μ–΄λŠ μͺ½μ΄ 더 μ €λ ΄ν•œμ§€ 평가해야 ν•©λ‹ˆλ‹€ πŸ˜‰

@ploeh μ—κ²Œλ„ 그의 생각을 λ¬Όμ–΄λ³΄μž. ν‰μ†Œ 마크의 닡은 κΉŠμ—ˆκ³  κ²°κ³Όλ₯Ό ν•΄κ²°ν•˜κΈ° λ³΄λ‹€λŠ” κ·Όλ³Έ 원인을 λ¨Όμ € 찾아보렀고 ν•©λ‹ˆλ‹€ πŸ˜…

더 κΆκΈˆν•œ 사항이 μžˆμœΌμ‹œλ©΄ μ§ˆλ¬Έν•΄μ£Όμ„Έμš”! λ‚˜λŠ” 항상 κ·Έλ“€μ—κ²Œ λŒ€λ‹΅μ„ ν™˜μ˜ν•©λ‹ˆλ‹€.

PS FWIW, AutoFixtureλ₯Ό μ‚¬μš©ν•˜μ—¬ μœ μ‚¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜λ €κ³  μ‹œλ„ν•œ μƒ˜ν”Œμ„ μ œκ³΅ν•˜κΈ°λ‘œ κ²°μ •ν–ˆμŠ΅λ‹ˆλ‹€(κ°„λ‹¨ν•˜κ²Œ μœ μ§€ν•˜λ €κ³  ν–ˆμ§€λ§Œ κ·€ν•˜μ˜ κ²½μš°μ—λŠ” μ™„μ „νžˆ μž‘λ™ν•˜μ§€ μ•Šμ„ 수 있음).


μ†ŒμŠ€ μ½”λ“œλ₯Ό 보렀면 ν΄λ¦­ν•˜μ‹­μ‹œμ˜€

```c#
μ‹œμŠ€ν…œ μ‚¬μš©;
AutoFixture μ‚¬μš©;
AutoFixture.Xunit2 μ‚¬μš©;
Xunit을 μ‚¬μš©ν•˜μ—¬;

λ„€μž„μŠ€νŽ˜μ΄μŠ€ AutoFixturePlayground
{
곡용 정적 클래슀 Util
{
곡개 정적 bool IsPrime(int 번호)
{
// https://stackoverflow.com/a/15743238/2009373 μ—μ„œ 볡사

        if (number <= 1) return false;
        if (number == 2) return true;
        if (number % 2 == 0) return false;

        var boundary = (int) Math.Floor(Math.Sqrt(number));

        for (int i = 3; i <= boundary; i += 2)
        {
            if (number % i == 0) return false;
        }

        return true;
    }
}

public class DepA
{
    public int Value { get; set; }
}

public class DepB
{
    public int PrimeNumber { get; }
    public int AnyOtherValue { get; }

    public DepB(int primeNumber, int anyOtherValue)
    {
        if (!Util.IsPrime(primeNumber))
            throw new ArgumentOutOfRangeException(nameof(primeNumber), primeNumber, "Number is not prime.");

        PrimeNumber = primeNumber;
        AnyOtherValue = anyOtherValue;
    }
}

public class DepC
{
    public DepA DepA { get; }
    public DepB DepB { get; }

    public DepC(DepA depA, DepB depB)
    {
        if (depB.PrimeNumber < depA.Value)
            throw new ArgumentException("Second should be larger than first.");

        DepA = depA;
        DepB = depB;
    }

    public int GetPrimeNumber() => DepB.PrimeNumber;
}

public class Issue1067
{
    [Theory, CustomAutoData]
    public void ShouldReturnPrimeNumberFromDepB(DepC sut)
    {
        var result = sut.GetPrimeNumber();

        Assert.Equal(sut.DepB.PrimeNumber, result);
    }
}

public class CustomAutoData : AutoDataAttribute
{
    public CustomAutoData() : base(() =>
    {
        var fixture = new Fixture();

        // Add prime numbers generator, returning numbers from the predefined list
        fixture.Customizations.Add(new ElementsBuilder<PrimeNumber>(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41));

        // Customize DepB to pass prime numbers only to ctor
        fixture.Customize<DepB>(c => c.FromFactory((PrimeNumber pn, int anyNumber) => new DepB(pn, anyNumber)));

        // Customize DepC, so that depA.Value is always less than depB.PrimeNumber
        fixture.Customize<DepC>(c => c.FromFactory((DepA depA, DepB depB, byte diff) =>
        {
            depA.Value = depB.PrimeNumber - diff;
            return new DepC(depA, depB);
        }));

        return fixture;
    })
    {
    }
}

/// <summary>
/// A helper type to represent a prime number, so that you can resolve prime numbers 
/// </summary>
public readonly struct PrimeNumber
{
    public int Value { get; }

    public PrimeNumber(int value)
    {
        Value = value;
    }

    public static implicit operator int(PrimeNumber prime) => prime.Value;
    public static implicit operator PrimeNumber(int value) => new PrimeNumber(value);
}

}
```

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

λΌλ””μ˜€ 침묡 μ£„μ†‘ν•©λ‹ˆλ‹€. μš°λ¦¬λŠ” μ‚΄μ•„ 있고 곧 λ‹΅μž₯을 λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€. μš”μ¦˜ 제 μ£Όμš” μ—…λ¬΄λ‘œ 맀우 λ°”μ©λ‹ˆλ‹€. λ˜ν•œ NSubstitute v4 릴리슀λ₯Ό μž‘μ—…ν•˜κ³  μžˆμœΌλ―€λ‘œ μ‹œκ°„μ΄ 맀우 μ œν•œμ μž…λ‹ˆλ‹€. :pensive: 질문이 μ–΄λ ΅κΈ° λ•Œλ¬Έμ— 닡변을 κ²Œμ‹œν•˜κΈ° 전에 κ°€λŠ₯ν•œ λͺ¨λ“  방법에 λŒ€ν•΄ μƒκ°ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

κΈ°λ‹€λ € μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. 계속 μ§€μΌœλ΄ μ£Όμ„Έμš” :wink:

μ•ˆλ…•ν•˜μ„Έμš”,
그것에 λŒ€ν•œ μ†Œμ‹μ΄ μžˆμŠ΅λ‹ˆκΉŒ?
μ••λ ₯이 μ—†μŠ΅λ‹ˆλ‹€(λ‚˜λŠ” λ“œλ¦΄ πŸ˜„ 을 μ•Œκ³  있고 μ‹€μ œλ‘œ μ°¨λ‹¨ν•˜μ§€λ„ μ•ŠμŠ΅λ‹ˆλ‹€. κ΅μœ‘λ°›μ€ 쑰언을 λ°›κ³  μ‹ΆμŠ΅λ‹ˆλ‹€). 단지 κ°€μ‹œμ„±μ΄ μžˆλŠ”μ§€ μ•Œμ•„λ³΄κΈ° μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€.
정말 κ°μ‚¬ν•©λ‹ˆλ‹€!

μ•ˆλ…•ν•˜μ„Έμš”! λ§ˆμ§€λ§‰μœΌλ‘œ 닡변을 μœ„ν•΄ μ•½κ°„μ˜ μœ ν˜•μ„ ν• λ‹Ήν–ˆμŠ΅λ‹ˆλ‹€. 닡변이 λ„ˆλ¬΄ λŠ¦μ–΄μ„œ μ£„μ†‘ν•©λ‹ˆλ‹€ 😊

μš°μ„  AutoFixture의 핡심은 맀우 κ°„λ‹¨ν•˜λ©° μ œμ•½ 쑰건이 μžˆλŠ” λ³΅μž‘ν•œ νŠΈλ¦¬μ— λŒ€ν•œ κΈ°λ³Έ 제곡 지원이 μ—†λ‹€λŠ” 점에 μœ μ˜ν•˜μ‹­μ‹œμ˜€. κ°„λ‹¨νžˆ λ§ν•΄μ„œ 생성 μ „λž΅μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • 곡용 μƒμ„±μž λ˜λŠ” 정적 νŒ©ν† λ¦¬ λ©”μ†Œλ“œ(ν˜„μž¬ μœ ν˜•μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ¦¬ν„΄ν•˜λŠ” 정적 λ©”μ†Œλ“œ)λ₯Ό μ°ΎμœΌμ‹­μ‹œμ˜€.
  • μƒμ„±μž 인수λ₯Ό ν•΄κ²°ν•˜κ³  μΈμŠ€ν„΄μŠ€λ₯Ό ν™œμ„±ν™”ν•©λ‹ˆλ‹€.
  • μ“°κΈ° κ°€λŠ₯ν•œ 곡용 속성과 ν•„λ“œλ₯Ό μƒμ„±λœ κ°’μœΌλ‘œ μ±„μ›λ‹ˆλ‹€.

ν˜„μž¬ μ ‘κ·Ό 방식을 μ‚¬μš©ν•˜λ©΄ 이전에 λ°œκ²¬ν•œ κ²ƒμ²˜λŸΌ 쒅속성 μ œμ•½ 쑰건을 μ–΄λ–»κ²Œλ“  μ œμ–΄ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

νŠΉμ • μœ ν˜•μ„ λΉŒλ“œν•˜λŠ” 방법을 μ§€μ •ν•˜κΈ° μœ„ν•œ λͺ‡ 가지 μ‚¬μš©μž 지정 지점이 μžˆμ§€λ§Œ μƒλŒ€μ μœΌλ‘œ κ°„λ‹¨ν•˜κ³  λ³΅μž‘ν•œ κ·œμΉ™μ„ μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

AutoFixtureμ—μ„œ μ΄λŸ¬ν•œ μ’…λ₯˜μ˜ ꡬ쑰 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” κ°€μž₯ 쒋은 방법은 λ¬΄μ—‡μž…λ‹ˆκΉŒ? λ‚΄ 말은, λ‚˜λŠ” λΆ„λͺ…νžˆ μ‚¬μš©μž μ •μ˜λ₯Ό μž‘μ„±ν•  κ²ƒμ΄μ§€λ§Œ 거기에 무엇을 넣을 κ²ƒμž…λ‹ˆκΉŒ?

  • μž„μ˜μ˜ μ •μˆ˜λ₯Ό μƒμ„±ν•˜κ³  κ·Έ 쀑 ν•˜λ‚˜κ°€ μ†Œμˆ˜κ°€ 될 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ(λ˜λŠ” μ†Œμˆ˜ 생성 μ•Œκ³ λ¦¬μ¦˜μ„ λ‹Ήμ—°νžˆ μ‹€ν–‰)? 이런 μ’…λ₯˜μ˜ μ œμ•½ μ‘°κ±΄μ—μ„œλŠ” ν—ˆμš©λ  수 μžˆμ§€λ§Œ μ œμ•½ 쑰건을 μ€€μˆ˜ν•˜κΈ°κ°€ 더 κΉŒλ‹€λ‘­λ‹€λ©΄ λΉ„μš©μ΄ λΉ λ₯΄κ²Œ λ“€ κ²ƒμž…λ‹ˆλ‹€.

  • ν—ˆμš© κ°€λŠ₯ν•œ κ°’μ˜ μœ ν•œ λͺ©λ‘μ„ μ œκ³΅ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

κΈ€μŽ„, λΆˆν–‰νžˆλ„ λ‚˜λŠ” 여기에 은색 μ΄μ•Œμ΄ 보이지 μ•ŠμœΌλ©° μ ‘κ·Ό 방식은 상황에 따라 λ‹€λ¦…λ‹ˆλ‹€. 값에 λ„ˆλ¬΄ λ¬΄μž‘μœ„λ‘œ μ˜μ‘΄ν•˜μ§€ μ•Šκ±°λ‚˜ 단일 SUTκ°€ 1-2개의 μ†Œμˆ˜λ§Œ μ‚¬μš©ν•˜λŠ” 경우 μ†Œμˆ˜λ₯Ό ν•˜λ“œμ½”λ”©ν•˜κ³  μ†Œμˆ˜ μ€‘μ—μ„œ μ„ νƒν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€( ElementsBulider<> λ‚΄μž₯ λ„μš°λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬ν•œ 경우). λ°˜λ©΄μ— λ§Žμ€ μ†Œμˆ˜ λͺ©λ‘μ΄ ν•„μš”ν•˜κ³  κΈ΄ μ†Œμˆ˜ μ‹œν€€μŠ€λ‘œ μž‘μ—…ν•˜λŠ” 경우 λ™μ μœΌλ‘œ μƒμ„±ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μ½”λ”©ν•˜λŠ” 것이 더 λ‚˜μ„ κ²ƒμž…λ‹ˆλ‹€.

λ˜ν•œ, 이둠적으둜 κ°œλ³„μ μœΌλ‘œ μž„μ˜μ μΌ 수 μžˆλŠ” μ—¬λŸ¬ 인수λ₯Ό μ·¨ν•˜λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€λ €κ³  ν•œλ‹€κ³  κ°€μ •ν•΄ λ΄…μ‹œλ‹€. true이고 argCλŠ” argA 값에 따라 λ‹€λ₯Έ μœ νš¨μ„± 검사 κ·œμΉ™μ„ μ€€μˆ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ argC.X 속성이 argA.X 속성과 μΌμΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

이 경우 μ–΄λ–»κ²Œ ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

정말 쒋은 질문이고 λΆˆν–‰νžˆλ„ AutoFixtureλŠ” μƒμžμ—μ„œ κΊΌλ‚΄λŠ” 쒋은 λ°©λ²•μœΌλ‘œ 문제λ₯Ό ν•΄κ²°ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 일반적으둜 각 μœ ν˜•μ— λŒ€ν•œ μ‚¬μš©μž μ •μ˜λ₯Ό λΆ„λ¦¬ν•˜λ €κ³  ν•˜λ―€λ‘œ ν•œ μœ ν˜•μ— λŒ€ν•œ μ‚¬μš©μž μ •μ˜λŠ” 단일 μœ ν˜•μ— λŒ€ν•œ μƒμ„±λ§Œ μ œμ–΄ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 제 κ²½μš°μ—λŠ” μœ ν˜•μ΄ 독립적이며 λΆ„λͺ…νžˆ κ·€ν•˜μ˜ κ²½μš°μ—λŠ” 잘 μž‘λ™ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€. λ˜ν•œ AutoFixtureλŠ” 기본적으둜 μ»¨ν…μŠ€νŠΈλ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ νŠΉμ • μœ ν˜•μ— λŒ€ν•œ μ‚¬μš©μž μ •μ˜λ₯Ό μž‘μ„±ν•  λ•Œ 개체(λ‚΄λΆ€μ μœΌλ‘œ ν‘œλ³Έμ΄λΌκ³  함)λ₯Ό μƒμ„±ν•˜λŠ” μ»¨ν…μŠ€νŠΈλ₯Ό λͺ…ν™•ν•˜κ²Œ 이해할 수 μ—†μŠ΅λ‹ˆλ‹€.

λ‚΄ 머리 μœ„μ—, λ‚˜λŠ” 일반적으둜 λ‹€μŒκ³Ό 같은 μ „λž΅μ„ μΆ”μ²œν•  것이라고 λ§ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

  • 단일 개체 μœ ν˜•μ˜ μƒμ„±λ§Œ μ œμ–΄ν•˜λŠ” β€‹β€‹λ°©μ‹μœΌλ‘œ 각 μœ ν˜•μ— λŒ€ν•œ μ‚¬μš©μž μ •μ˜λ₯Ό 생성해 λ³΄μ‹­μ‹œμ˜€.
  • νŠΉμ • μ œμ•½ 쑰건이 μžˆλŠ” 쒅속성을 λ§Œλ“€μ–΄μ•Ό ν•˜λŠ” 경우 μ‚¬μš©μž μ§€μ •μ—μ„œλ„ ν•΄λ‹Ή 쒅속성을 ν™œμ„±ν™”ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. 쒅속성이 λ³€κ²½ κ°€λŠ₯ν•œ 경우 AutoFixture에 쒅속성을 μƒμ„±ν•˜λ„λ‘ μš”μ²­ν•˜κ³  λ‚˜μ€‘μ— ν˜Έν™˜λ˜λŠ” λ°©μ‹μœΌλ‘œ ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λ ‡κ²Œ ν•˜λ©΄ λ‚΄λΆ€ μ•„ν‚€ν…μ²˜μ™€ λ„ˆλ¬΄ 많이 λͺ¨μˆœλ˜μ§€ μ•Šκ³  μž‘λ™ 방식이 λͺ…ν™•ν•΄μ§‘λ‹ˆλ‹€. λ¬Όλ‘  잠재적으둜 이 방법은 맀우 μž₯ν™©ν•©λ‹ˆλ‹€.

λ³΅μž‘ν•œ μ œμ•½ 쑰건이 μžˆλŠ” κ²½μš°κ°€ ν”ν•˜μ§€ μ•Šμ€ 경우 κΈ°μ‘΄ κΈ°λŠ₯으둜 μΆ©λΆ„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 도메인 λͺ¨λΈμ΄ μ΄λŸ¬ν•œ 경우둜 가득 μ°¨ μžˆλ‹€λ©΄ μ†”μ§νžˆ AutoFixtureκ°€ 졜고의 도ꡬ가 아닐 수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λ§ˆλ„ μ‹œμž₯μ—λŠ” μ΄λŸ¬ν•œ 문제λ₯Ό κ°€μž₯ μš°μ•„ν•œ λ°©μ‹μœΌλ‘œ ν•΄κ²°ν•  수 μžˆλŠ” 더 λ‚˜μ€ 도ꡬ가 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€. λ¬Όλ‘  AutoFixtureκ°€ 맀우 μœ μ—°ν•˜κ³  거의 λͺ¨λ“  것을 μž¬μ •μ˜ν•  수 μžˆμœΌλ―€λ‘œ AutoFixture μ½”μ–΄ μœ„μ— 항상 κ³ μœ ν•œ DSL을 생성할 수 μžˆλ‹€λŠ” 점을 μ–ΈκΈ‰ν•  κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€... ν•˜μ§€λ§Œ μ–΄λŠ μͺ½μ΄ 더 μ €λ ΄ν•œμ§€ 평가해야 ν•©λ‹ˆλ‹€ πŸ˜‰

@ploeh μ—κ²Œλ„ 그의 생각을 λ¬Όμ–΄λ³΄μž. ν‰μ†Œ 마크의 닡은 κΉŠμ—ˆκ³  κ²°κ³Όλ₯Ό ν•΄κ²°ν•˜κΈ° λ³΄λ‹€λŠ” κ·Όλ³Έ 원인을 λ¨Όμ € 찾아보렀고 ν•©λ‹ˆλ‹€ πŸ˜…

더 κΆκΈˆν•œ 사항이 μžˆμœΌμ‹œλ©΄ μ§ˆλ¬Έν•΄μ£Όμ„Έμš”! λ‚˜λŠ” 항상 κ·Έλ“€μ—κ²Œ λŒ€λ‹΅μ„ ν™˜μ˜ν•©λ‹ˆλ‹€.

PS FWIW, AutoFixtureλ₯Ό μ‚¬μš©ν•˜μ—¬ μœ μ‚¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜λ €κ³  μ‹œλ„ν•œ μƒ˜ν”Œμ„ μ œκ³΅ν•˜κΈ°λ‘œ κ²°μ •ν–ˆμŠ΅λ‹ˆλ‹€(κ°„λ‹¨ν•˜κ²Œ μœ μ§€ν•˜λ €κ³  ν–ˆμ§€λ§Œ κ·€ν•˜μ˜ κ²½μš°μ—λŠ” μ™„μ „νžˆ μž‘λ™ν•˜μ§€ μ•Šμ„ 수 있음).


μ†ŒμŠ€ μ½”λ“œλ₯Ό 보렀면 ν΄λ¦­ν•˜μ‹­μ‹œμ˜€

```c#
μ‹œμŠ€ν…œ μ‚¬μš©;
AutoFixture μ‚¬μš©;
AutoFixture.Xunit2 μ‚¬μš©;
Xunit을 μ‚¬μš©ν•˜μ—¬;

λ„€μž„μŠ€νŽ˜μ΄μŠ€ AutoFixturePlayground
{
곡용 정적 클래슀 Util
{
곡개 정적 bool IsPrime(int 번호)
{
// https://stackoverflow.com/a/15743238/2009373 μ—μ„œ 볡사

        if (number <= 1) return false;
        if (number == 2) return true;
        if (number % 2 == 0) return false;

        var boundary = (int) Math.Floor(Math.Sqrt(number));

        for (int i = 3; i <= boundary; i += 2)
        {
            if (number % i == 0) return false;
        }

        return true;
    }
}

public class DepA
{
    public int Value { get; set; }
}

public class DepB
{
    public int PrimeNumber { get; }
    public int AnyOtherValue { get; }

    public DepB(int primeNumber, int anyOtherValue)
    {
        if (!Util.IsPrime(primeNumber))
            throw new ArgumentOutOfRangeException(nameof(primeNumber), primeNumber, "Number is not prime.");

        PrimeNumber = primeNumber;
        AnyOtherValue = anyOtherValue;
    }
}

public class DepC
{
    public DepA DepA { get; }
    public DepB DepB { get; }

    public DepC(DepA depA, DepB depB)
    {
        if (depB.PrimeNumber < depA.Value)
            throw new ArgumentException("Second should be larger than first.");

        DepA = depA;
        DepB = depB;
    }

    public int GetPrimeNumber() => DepB.PrimeNumber;
}

public class Issue1067
{
    [Theory, CustomAutoData]
    public void ShouldReturnPrimeNumberFromDepB(DepC sut)
    {
        var result = sut.GetPrimeNumber();

        Assert.Equal(sut.DepB.PrimeNumber, result);
    }
}

public class CustomAutoData : AutoDataAttribute
{
    public CustomAutoData() : base(() =>
    {
        var fixture = new Fixture();

        // Add prime numbers generator, returning numbers from the predefined list
        fixture.Customizations.Add(new ElementsBuilder<PrimeNumber>(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41));

        // Customize DepB to pass prime numbers only to ctor
        fixture.Customize<DepB>(c => c.FromFactory((PrimeNumber pn, int anyNumber) => new DepB(pn, anyNumber)));

        // Customize DepC, so that depA.Value is always less than depB.PrimeNumber
        fixture.Customize<DepC>(c => c.FromFactory((DepA depA, DepB depB, byte diff) =>
        {
            depA.Value = depB.PrimeNumber - diff;
            return new DepC(depA, depB);
        }));

        return fixture;
    })
    {
    }
}

/// <summary>
/// A helper type to represent a prime number, so that you can resolve prime numbers 
/// </summary>
public readonly struct PrimeNumber
{
    public int Value { get; }

    public PrimeNumber(int value)
    {
        Value = value;
    }

    public static implicit operator int(PrimeNumber prime) => prime.Value;
    public static implicit operator PrimeNumber(int value) => new PrimeNumber(value);
}

}
```

μ•ˆλ…•ν•˜μ„Έμš” @zvirja

와, μžμ„Έν•œ λ‹΅λ³€ κ°μ‚¬ν•©λ‹ˆλ‹€, 정말 μž¬λ―ΈμžˆμŠ΅λ‹ˆλ‹€. λͺ‡ 가지 ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•˜κ³  μˆ˜ν–‰ν•  κ°€μΉ˜κ°€ μžˆλŠ”μ§€ 평가해야 ν•˜μ§€λ§Œ 이 λͺ¨λ“  것이 ν›Œλ₯­ν•©λ‹ˆλ‹€.

μ²˜λ¦¬ν•΄μ•Ό ν•  쒅속성이 λ„ˆλ¬΄ λ§Žλ‹€κ³  μƒκ°ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ κ·€ν•˜μ˜ μ ‘κ·Ό 방식이 쒋은 방법일 수 μžˆμŠ΅λ‹ˆλ‹€. λ¬Όλ‘  @ploeh μ—μ„œ μΆ”κ°€ν•  사항이 있으면 μ˜κ΄‘μž…λ‹ˆλ‹€ πŸ‘Œ

λ‹€μ‹œ ν•œ 번 κ°μ‚¬ν•©λ‹ˆλ‹€. 쒋은 일을 κ³„μ†ν•˜μ‹­μ‹œμ˜€!

AutoFixture 및 속성 기반 ν…ŒμŠ€νŠΈμ— λŒ€ν•œ 제 κ²½ν—˜μ— λ”°λ₯΄λ©΄ λ‹€μŒκ³Ό 같은 문제λ₯Ό ν•΄κ²°ν•˜λŠ” λ°λŠ” 기본적으둜 두 가지 방법이 μžˆμŠ΅λ‹ˆλ‹€.

  • 필터링
  • μ•Œκ³ λ¦¬μ¦˜ 생성

(λ‚΄κ°€ μ“°κ³  μžˆλŠ” λ™μ•ˆ λ‚΄ 직관은 이것듀이 각각 _catamorphisms_ 및 _anamorphisms_일 수 μžˆλ‹€κ³  μ œμ•ˆν•˜μ§€λ§Œ, λ‚˜λŠ” 이것에 λŒ€ν•΄ μ’€ 더 생각해야 ν•  κ²ƒμ΄λ―€λ‘œ 이것은 μ œμ³λ‘κ³  λŒ€λΆ€λΆ„ λ‚˜ μžμ‹ μ— λŒ€ν•œ λ©”λͺ¨μž…λ‹ˆλ‹€.)

λ¬΄μž‘μœ„λ‘œ μƒμ„±λœ 값이 _λŒ€λΆ€λΆ„_ μ•ˆμ— λ“€μ–΄μ•Ό ν•˜λŠ” μ œμ•½ 쑰건에 맞으면 κΈ°μ‘΄ 생성기λ₯Ό μ‚¬μš©ν•˜μ§€λ§Œ 가끔 λΆ€μ ν•©ν•œ 값을 λ²„λ¦¬λŠ” 것이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” κ°€μž₯ μ‰¬μš΄ 방법이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

λ°˜λ©΄μ— ν•„ν„°κ°€ λŒ€λΆ€λΆ„μ˜ μž„μ˜ 데이터λ₯Ό λ²„λ¦¬λŠ” 것을 μ˜λ―Έν•˜λŠ” 경우, μ•„λ§ˆλ„ μž„μ˜μ˜ μ‹œλ“œ 값을 기반으둜 문제의 μ œμ•½ 쑰건에 λ§žλŠ” 값을 μƒμ„±ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μ œμ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€.

λͺ‡ λ…„ 전에 μ €λŠ” FsCheck 의 λ§₯λ½μ—μ„œ 두 가지 μ ‘κ·Ό λ°©μ‹μ˜ κ°„λ‹¨ν•œ 예λ₯Ό λ³΄μ—¬μ£ΌλŠ” 강연을 ν–ˆμŠ΅λ‹ˆλ‹€ . 이 ν”„λ ˆμ  ν…Œμ΄μ…˜μ€ μ‹€μ œλ‘œ λ™μΌν•œ μ ‘κ·Ό 방식을 μ·¨ν–ˆμ§€λ§Œ λŒ€μ‹  AutoFixtureλ₯Ό μ‚¬μš©ν•˜λŠ” λŒ€ν™”μ˜ μ§„ν™”μž…λ‹ˆλ‹€. λΆˆν–‰νžˆλ„ κ·Έ λŒ€ν™”μ— λŒ€ν•œ λ…ΉμŒμ΄ μ—†μŠ΅λ‹ˆλ‹€.

두 가지 λ°©λ²•μœΌλ‘œ μ†Œμˆ˜ μš”κ΅¬ 사항을 ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•„ν„° μ ‘κ·Ό 방식은 μ œμ•½μ΄ μ—†λŠ” 숫자λ₯Ό μƒμ„±ν•œ λ‹€μŒ μ‹€μ œλ‘œ μ†Œμˆ˜κ°€ 될 λ•ŒκΉŒμ§€ 숫자λ₯Ό λ²„λ¦¬λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ•Œκ³ λ¦¬μ¦˜ μ ‘κ·Ό 방식은 μ†Œμˆ˜ 체와 같은 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ μ†Œμˆ˜λ₯Ό μƒμ„±ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이것은 λ¬΄μž‘μœ„κ°€ μ•„λ‹ˆλ―€λ‘œ μž„μ˜ν™”ν•˜λŠ” 방법을 μ•Œκ³  싢을 수 μžˆμŠ΅λ‹ˆλ‹€.

AutoFixtureμ—μ„œ μ œν•œλœ 값을 μ²˜λ¦¬ν•˜λŠ” 방법에 λŒ€ν•œ μ „λ°˜μ μΈ μ§ˆλ¬Έμ€ λ‹€λ₯Έ μ‚¬λžŒλ“€μ΄ 라이브러리λ₯Ό 보기 μ‹œμž‘ν•˜μž 거의 μ¦‰μ‹œ μ œκΈ°λ˜μ—ˆμœΌλ©° λ‹Ήμ‹œμ—λ„ μ—¬μ „νžˆ μ°Έμ‘°ν•˜λŠ” 기사λ₯Ό μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€. http://blog.ploeh.dk/2009/ 05/01/μ œμ•½ μž…λ ₯ 처리

μ„œλ‘œ κ΄€λ ¨λœ μ—¬λŸ¬ 값에 λŒ€ν•œ 질문과 κ΄€λ ¨ν•˜μ—¬ 일반적인 지침을 μ œκ³΅ν•˜κ³  싢지 μ•ŠμŠ΅λ‹ˆλ‹€. 그런 μ’…λ₯˜μ˜ μ§ˆλ¬Έμ€ μ’…μ’… XY λ¬Έμ œμž…λ‹ˆλ‹€. λ§Žμ€ κ²½μš°μ— μ„ΈλΆ€ 사항을 μ΄ν•΄ν•˜λ©΄ λŒ€μ²΄ 섀계가 AutoFixture뿐만 μ•„λ‹ˆλΌ ν”„λ‘œλ•μ…˜ μ½”λ“œ 기반 자체의 λ¬Έμ œλ„ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ XY λ¬Έμ œκ°€ μžˆλŠ” κ²½μš°μ—λ„ 이것이 μ •λ‹Ήν•œ λ¬Έμ œκ°€ 될 수 μžˆλŠ” 상황이 μ—¬μ „νžˆ μžˆμ„ 수 μžˆμ§€λ§Œ λ‚΄ κ²½ν—˜μ— λ”°λ₯΄λ©΄ 문제λ₯Ό μ‚¬λ‘€λ³„λ‘œ μ²˜λ¦¬ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. 희귀 ν•œ.

λ”°λΌμ„œ 이에 λŒ€ν•œ ꡬ체적인 μ˜ˆκ°€ μžˆλ‹€λ©΄ μ œκ°€ 도움을 λ“œλ¦΄ μˆ˜λŠ” μžˆμ§€λ§Œ 일반적인 μ§ˆλ¬Έμ— 의미 있게 λ‹΅ν•  μˆ˜λŠ” 없을 것 κ°™μŠ΅λ‹ˆλ‹€.

@ploeh 이 닡변에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. μ΄λŠ” μ œκ°€ κ³ λ €ν•˜κ³  있던 μ ‘κ·Ό 방식을 ν™•μΈμ‹œμΌœμ€λ‹ˆλ‹€.
μƒν˜Έ 의쑴적인 값이 λŒ€λΆ€λΆ„ XY λ¬Έμ œλΌλŠ” 데 μ „μ μœΌλ‘œ λ™μ˜ν•©λ‹ˆλ‹€(적어도 제 κ²½μš°μ—λŠ”). λ¬Έμ œλŠ” λ ˆκ±°μ‹œ(ν…ŒμŠ€νŠΈλ˜μ§€ μ•Šμ€ 😒) μ½”λ“œλ‘œ μž‘μ—…ν•  λ•Œ μ΄λŸ¬ν•œ 값을 μ²˜λ¦¬ν•˜λŠ” 것이 μš°λ¦¬κ°€ 얻을 λ•ŒκΉŒμ§€ μ–΄μ¨Œλ“  λͺ‡ 가지 ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λŠ” 쒋은 μ‹œμž‘μ΄λΌλŠ” κ²ƒμž…λ‹ˆλ‹€. 이것을 μ œλŒ€λ‘œ λ¦¬νŒ©ν† λ§ν•  μ‹œκ°„.

μ–΄μ¨Œλ“  두 가지 λ‹΅λ³€ λͺ¨λ‘ 문제λ₯Ό μ•„μ£Ό 잘 ν•΄κ²°ν•˜λ―€λ‘œ κ±°κΈ°μ—μ„œ λ‚˜κ°€λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.
감사 ν•΄μš”!

BTW, λ‚˜λŠ” @zvirja에 λŒ€ν•œ μΆ”κ°€λ‘œ λ‚΄ λŒ€λ‹΅μ„ μ˜λ―Έν–ˆλ‹€λŠ” 것을 μ–ΈκΈ‰ν•˜λŠ” 것을 μžŠμ—ˆμŠ΅λ‹ˆλ‹€. 거기에 이미 쒋은 λ‹΅λ³€μž…λ‹ˆλ‹€ πŸ‘

πŸ˜„ λ‹€λ₯Έ 방법은 μ·¨ν•˜μ§€ μ•Šμ•˜μ–΄μš”.

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