AutoFixtureκ° μμ±μμ μ¬μν μ μ½ μ‘°κ±΄μ΄ μλ κ°μ²΄λ₯Ό μμ±νλλ‘ νλ κ°μ₯ μ’μ λ°©λ²μ μμ λ΄λ €κ³ λ Έλ ₯νκ³ μμ΅λλ€. μλ₯Ό λ€μ΄, μ μλ₯Ό μ·¨νκ³ μμλ§ λ°μλ€μ΄λ PrimeNumber λ°μ΄ν° ꡬ쑰λ₯Ό μ¬μ©νκ³ μΆλ€κ³ κ°μ ν΄ λ΄ μλ€.
AutoFixtureμμ μ΄λ¬ν μ’ λ₯μ ꡬ쑰 μΈμ€ν΄μ€λ₯Ό μμ±νλ κ°μ₯ μ’μ λ°©λ²μ 무μμ λκΉ? λ΄ λ§μ, λλ λΆλͺ ν μ¬μ©μ μ μλ₯Ό μμ±ν κ²μ΄μ§λ§ κ±°κΈ°μ 무μμ λ£μ κ²μ λκΉ?
λν, μ΄λ‘ μ μΌλ‘ κ°λ³μ μΌλ‘ μμμ μΌ μ μλ μ¬λ¬ μΈμλ₯Ό μ·¨νλ μΈμ€ν΄μ€λ₯Ό λ§λ€λ €κ³ νλ€κ³ κ°μ ν΄ λ΄ μλ€. trueμ΄κ³ argCλ argA κ°μ λ°λΌ λ€λ₯Έ μ ν¨μ± κ²μ¬ κ·μΉμ μ€μν΄μΌ ν©λλ€. κ·Έλ μ§ μμΌλ©΄ argC.X μμ±μ΄ argA.X μμ±κ³Ό μΌμΉν΄μΌ ν©λλ€.
μ΄ κ²½μ° μ΄λ»κ² νμκ² μ΅λκΉ?
κ·Έλ¦¬κ³ λ§μ§λ§μΌλ‘(λͺ κ°μ§ λ¬Έμ λ₯Ό λ§λ€ μλ μμμ§λ§ λͺ¨λ μ£Όμ κ° κ°μ λ¬Έμ μ λ€λ₯Έ μΈ‘λ©΄μ΄λΌκ³ λκΌμ΅λλ€) μ ν΄λμ€λ₯Ό μΆκ°ν λλ§λ€ μ΄λ¬ν μ’ λ₯μ μ¬μ©μ μ§μ μ λ§λ€κ³ μ μ©ν΄μΌ νκ³ μ ν¨μ± κ²μ¬ κ·μΉ λ³κ²½μ λ§μ μμ μ²λΌ 보μ λλ€. μ΄λ₯Ό μννκΈ° μν΄ λͺ κ°μ§ κΈ°μ μ μ μ©ν©λκΉ?
λ무 κ°μ¬ν©λλ€. κΈ΄ μκ° λμ μ£μ‘ν©λλ€. λ무 μ§μ λΆν κ²μλ¬Όμ΄ μλκΈΈ λ°λλλ€.
λΌλμ€ μΉ¨λ¬΅ μ£μ‘ν©λλ€. μ°λ¦¬λ μ΄μ μκ³ κ³§ λ΅μ₯μ λλ¦¬κ² μ΅λλ€. μμ¦ μ μ£Όμ μ λ¬΄λ‘ λ§€μ° λ°μ©λλ€. λν NSubstitute v4 릴리μ€λ₯Ό μμ νκ³ μμΌλ―λ‘ μκ°μ΄ λ§€μ° μ νμ μ λλ€. :pensive: μ§λ¬Έμ΄ μ΄λ ΅κΈ° λλ¬Έμ λ΅λ³μ κ²μνκΈ° μ μ κ°λ₯ν λͺ¨λ λ°©λ²μ λν΄ μκ°νκ³ μΆμ΅λλ€.
κΈ°λ€λ € μ£Όμ μ κ°μ¬ν©λλ€. κ³μ μ§μΌλ΄ μ£ΌμΈμ :wink:
μλ
νμΈμ,
κ·Έκ²μ λν μμμ΄ μμ΅λκΉ?
μλ ₯μ΄ μμ΅λλ€(λλ λ릴 π μ μκ³ μκ³ μ€μ λ‘ μ°¨λ¨νμ§λ μμ΅λλ€. κ΅μ‘λ°μ μ‘°μΈμ λ°κ³ μΆμ΅λλ€). λ¨μ§ κ°μμ±μ΄ μλμ§ μμ보기 μν κ²μ
λλ€.
μ λ§ κ°μ¬ν©λλ€!
μλ νμΈμ! λ§μ§λ§μΌλ‘ λ΅λ³μ μν΄ μ½κ°μ μ νμ ν λΉνμ΅λλ€. λ΅λ³μ΄ λ무 λ¦μ΄μ μ£μ‘ν©λλ€ π
μ°μ AutoFixtureμ ν΅μ¬μ λ§€μ° κ°λ¨νλ©° μ μ½ μ‘°κ±΄μ΄ μλ 볡μ‘ν νΈλ¦¬μ λν κΈ°λ³Έ μ 곡 μ§μμ΄ μλ€λ μ μ μ μνμμμ€. κ°λ¨ν λ§ν΄μ μμ± μ λ΅μ λ€μκ³Ό κ°μ΅λλ€.
νμ¬ μ κ·Ό λ°©μμ μ¬μ©νλ©΄ μ΄μ μ λ°κ²¬ν κ²μ²λΌ μ’ μμ± μ μ½ μ‘°κ±΄μ μ΄λ»κ²λ μ μ΄ν μ μμ΅λλ€.
νΉμ μ νμ λΉλνλ λ°©λ²μ μ§μ νκΈ° μν λͺ κ°μ§ μ¬μ©μ μ§μ μ§μ μ΄ μμ§λ§ μλμ μΌλ‘ κ°λ¨νκ³ λ³΅μ‘ν κ·μΉμ μ§μνμ§ μμ΅λλ€.
AutoFixtureμμ μ΄λ¬ν μ’ λ₯μ ꡬ쑰 μΈμ€ν΄μ€λ₯Ό μμ±νλ κ°μ₯ μ’μ λ°©λ²μ 무μμ λκΉ? λ΄ λ§μ, λλ λΆλͺ ν μ¬μ©μ μ μλ₯Ό μμ±ν κ²μ΄μ§λ§ κ±°κΈ°μ 무μμ λ£μ κ²μ λκΉ?
μμμ μ μλ₯Ό μμ±νκ³ κ·Έ μ€ νλκ° μμκ° λ λκΉμ§ λ°λ³΅νμκ² μ΅λκΉ(λλ μμ μμ± μκ³ λ¦¬μ¦μ λΉμ°ν μ€ν)? μ΄λ° μ’ λ₯μ μ μ½ μ‘°κ±΄μμλ νμ©λ μ μμ§λ§ μ μ½ μ‘°κ±΄μ μ€μνκΈ°κ° λ κΉλ€λ‘λ€λ©΄ λΉμ©μ΄ λΉ λ₯΄κ² λ€ κ²μ λλ€.
νμ© κ°λ₯ν κ°μ μ ν λͺ©λ‘μ μ 곡νμκ² μ΅λκΉ?
κΈμ, λΆννλ λλ μ¬κΈ°μ μμ μ΄μμ΄ λ³΄μ΄μ§ μμΌλ©° μ κ·Ό λ°©μμ μν©μ λ°λΌ λ€λ¦
λλ€. κ°μ λ무 무μμλ‘ μμ‘΄νμ§ μκ±°λ λ¨μΌ SUTκ° 1-2κ°μ μμλ§ μ¬μ©νλ κ²½μ° μμλ₯Ό νλμ½λ©νκ³ μμ μ€μμ μ ννλ κ²μ΄ μ’μ΅λλ€( ElementsBulider<>
λ΄μ₯ λμ°λ―Έκ° μμ΅λλ€. κ·Έλ¬ν κ²½μ°). λ°λ©΄μ λ§μ μμ λͺ©λ‘μ΄ νμνκ³ κΈ΄ μμ μνμ€λ‘ μμ
νλ κ²½μ° λμ μΌλ‘ μμ±νλ μκ³ λ¦¬μ¦μ μ½λ©νλ κ²μ΄ λ λμ κ²μ
λλ€.
λν, μ΄λ‘ μ μΌλ‘ κ°λ³μ μΌλ‘ μμμ μΌ μ μλ μ¬λ¬ μΈμλ₯Ό μ·¨νλ μΈμ€ν΄μ€λ₯Ό λ§λ€λ €κ³ νλ€κ³ κ°μ ν΄ λ΄ μλ€. trueμ΄κ³ argCλ argA κ°μ λ°λΌ λ€λ₯Έ μ ν¨μ± κ²μ¬ κ·μΉμ μ€μν΄μΌ ν©λλ€. κ·Έλ μ§ μμΌλ©΄ argC.X μμ±μ΄ argA.X μμ±κ³Ό μΌμΉν΄μΌ ν©λλ€.
μ΄ κ²½μ° μ΄λ»κ² νμκ² μ΅λκΉ?
μ λ§ μ’μ μ§λ¬Έμ΄κ³ λΆννλ 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μ λν μΆκ°λ‘ λ΄ λλ΅μ μλ―Ένλ€λ κ²μ μΈκΈνλ κ²μ μμμ΅λλ€. κ±°κΈ°μ μ΄λ―Έ μ’μ λ΅λ³μ λλ€ π
π λ€λ₯Έ λ°©λ²μ μ·¨νμ§ μμμ΄μ.
κ°μ₯ μ μ©ν λκΈ
μλ νμΈμ! λ§μ§λ§μΌλ‘ λ΅λ³μ μν΄ μ½κ°μ μ νμ ν λΉνμ΅λλ€. λ΅λ³μ΄ λ무 λ¦μ΄μ μ£μ‘ν©λλ€ π
μ°μ AutoFixtureμ ν΅μ¬μ λ§€μ° κ°λ¨νλ©° μ μ½ μ‘°κ±΄μ΄ μλ 볡μ‘ν νΈλ¦¬μ λν κΈ°λ³Έ μ 곡 μ§μμ΄ μλ€λ μ μ μ μνμμμ€. κ°λ¨ν λ§ν΄μ μμ± μ λ΅μ λ€μκ³Ό κ°μ΅λλ€.
νμ¬ μ κ·Ό λ°©μμ μ¬μ©νλ©΄ μ΄μ μ λ°κ²¬ν κ²μ²λΌ μ’ μμ± μ μ½ μ‘°κ±΄μ μ΄λ»κ²λ μ μ΄ν μ μμ΅λλ€.
νΉμ μ νμ λΉλνλ λ°©λ²μ μ§μ νκΈ° μν λͺ κ°μ§ μ¬μ©μ μ§μ μ§μ μ΄ μμ§λ§ μλμ μΌλ‘ κ°λ¨νκ³ λ³΅μ‘ν κ·μΉμ μ§μνμ§ μμ΅λλ€.
κΈμ, λΆννλ λλ μ¬κΈ°μ μμ μ΄μμ΄ λ³΄μ΄μ§ μμΌλ©° μ κ·Ό λ°©μμ μν©μ λ°λΌ λ€λ¦ λλ€. κ°μ λ무 무μμλ‘ μμ‘΄νμ§ μκ±°λ λ¨μΌ SUTκ° 1-2κ°μ μμλ§ μ¬μ©νλ κ²½μ° μμλ₯Ό νλμ½λ©νκ³ μμ μ€μμ μ ννλ κ²μ΄ μ’μ΅λλ€(
ElementsBulider<>
λ΄μ₯ λμ°λ―Έκ° μμ΅λλ€. κ·Έλ¬ν κ²½μ°). λ°λ©΄μ λ§μ μμ λͺ©λ‘μ΄ νμνκ³ κΈ΄ μμ μνμ€λ‘ μμ νλ κ²½μ° λμ μΌλ‘ μμ±νλ μκ³ λ¦¬μ¦μ μ½λ©νλ κ²μ΄ λ λμ κ²μ λλ€.μ λ§ μ’μ μ§λ¬Έμ΄κ³ λΆννλ 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 μμ 볡μ¬
}
```