๋ค์ ํ
์คํธ๋ AutoFixture 3.51.0
์์ ์ฑ๊ณตํ์ง๋ง 4.0.0-rc1
์์ ์คํจํฉ๋๋ค.
(๋ง์คํฐ์ ์ต์ ์ปค๋ฐ์์๋: c856cd6
)
``` C#
[์ฌ์ค]
๊ณต๊ฐ ๋ฌดํจ ShouldApplyCustomizationsFromBaseClass()
{
var ๊ณ ์ ์ฅ์น = new Fixture();
์ ์ฐฉ๋ฌผ.์ฌ์ฉ์ ์ ์
var res = fixture.Create
Assert.Equal(0, res.Id);
}
[์ฌ์ค]
๊ณต๊ฐ ๋ฌดํจ ShouldApplyCustomizationsFromInterface()
{
var ๊ณ ์ ์ฅ์น = new Fixture();
์ ์ฐฉ๋ฌผ.์ฌ์ฉ์ ์ ์
var res = fixture.Create
Assert.Equal(0, res.Id);
}
๊ณต๊ฐ ์ธํฐํ์ด์ค IInterface
{
์ ์ ID { ๊ฐ์ ธ์ค๊ธฐ; ์ธํธ; }
}
๊ณต๊ฐ ํด๋์ค
{
๊ณต๊ฐ ์ ์ ID { ๊ฐ์ ธ์ค๊ธฐ; ์ธํธ; }
}
๊ณต์ฉ ํด๋์ค ImplClass : BaseClass, IInterface
{
}
```
์ง๋ฌธ์ ์ฌ๋ ค์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ธ์, ์ด๊ฒ์ ์ํ๋ ๋ณ๊ฒฝ ์ฌํญ์ด๋ฉฐ ์๋์ ์ผ๋ก ์ ์ฉ๋ ๊ฒ์ ๋๋ค.
์ด์ ์๋ ํ ํ์ ์ ํ์ ์ฌ์ฉ์ ์ง์ ์ด ๋ค๋ฅธ ํ์ ์ ํ์ ์ํฅ์ ์ค ์ ์๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์๋ฅผ ๋ค์ด:
```c#
ํด๋์ค ๊ธฐ๋ณธ { ๊ณต๊ฐ ๋ฌธ์์ด ๊ณตํต { get; ์ธํธ; } }
ํด๋์ค Child1: ๊ธฐ๋ณธ { }
ํด๋์ค Child2: ๊ธฐ๋ณธ { }
[์ฌ์ค]
๊ณต๊ฐ ๋ฌดํจ ๋ณด์ฅCustomizationAreNotAffected()
{
var ๊ณ ์ ์ฅ์น = new Fixture();
์ ์ฐฉ๋ฌผ.์ฌ์ฉ์ ์ ์
var result = fixture.Create<Child2>();
Assert.NotNull(result.Common);
}
In the v3 this test failed, causing a lot of confusion to people. As you might imagine, the scenarios were more complicated and it was very non-obvious why the particular members are not initialized.
For instance, the following code will not work, which again proves that API is not designed for that.
```c#
fixture.Customize<Base>(c => c.With(x => x.Common, "foo"));
๋ฐ๋ผ์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ๊ทผ ๋ฐฉ์์ ๋ณ๊ฒฝํ์ฌ ์ด์ ํ ์ ํ์ ์ฌ์ฉ์ ์ ์๊ฐ ๋์ผํ ์์ ๋ผ์ธ์ ์ํ๋๋ผ๋ ๋ค๋ฅธ ์ ํ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค . ํด๋น PR์์ ๋ณผ ์ ์๋ฏ์ด ๋ง์ ์ฌ์ฉ์ฑ ๋ฌธ์ ๋ฅผ ์์ ํ๊ณ ๋ ๋ช ํ์ฑ์ ์ถ๊ฐํ์ต๋๋ค(๋ณ๊ฒฝ ์ฌํญ์ด ์ค์ ๋ก ์ค๋จ๋๋ ๋์).
๊ทธ๋๋ ๊ธฐ๋ณธ/์ธํฐํ์ด์ค ์์ฑ์ ์๋ตํ๋ ค๋ฉด ๋ค์ ์ค๋ํซ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
```c#
๊ฐ์ธ ํด๋์ค SamePropertySpecification : IRequestSpecification
{
๊ฐ์ธ ์ฝ๊ธฐ ์ ์ฉ ์ ํ _declaringType;
๊ฐ์ธ ์ฝ๊ธฐ ์ ์ฉ ๋ฌธ์์ด _name;
public SamePropertySpecification(Type declaringType, string name)
{
_declaringType = declaringType;
_name = name;
}
public bool IsSatisfiedBy(object request)
{
if (request is PropertyInfo pi)
{
return pi.DeclaringType == this._declaringType &&
pi.Name.Equals(this._name, StringComparison.Ordinal);
}
return false;
}
}
[์ฌ์ค]
๊ณต๊ฐ ๋ฌดํจ TestBasePropertyOmitting()
{
var ๊ณ ์ ์ฅ์น = new Fixture();
fixture.Customizations.Add(new Omitter(new SamePropertySpecification(typeof(Base), nameof(Base.Common))));
var result = fixture.Create<Child1>();
Assert.Null(result.Common);
}
```
ํด๋น ๊ธฐ๋ฅ์ด ์์ฃผ ํ์ํ ๊ฒฝ์ฐ fixture
๋ํ ๊ณ ์ ํ ํ์ฅ ๋ฐฉ๋ฒ์ ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๋งค์ฐ ํผ๋์ค๋ฌ์ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฌํ ๊ธฐ๋ฅ์ ์ฆ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ํฌํํ๊ณ ์ถ์ต๋๋ค.
์๊ฒ ์ต๋๋ค. ์๋์ ์ด์์ต๋๋ค. ํผ๋์ค๋ฝ๋ค๋ ์ ์๋ ํ์คํ ๋์ํ์ง๋ง ๋ช ์์ ์ผ๋ก ์ ์ฉํ ์ ์๋ค๋ฉด ์ข์ ๊ธฐ๋ฅ์ ๋๋ค. ์ค ๋ํซ์ ์๋ํ๊ณ ์๋ง๋ ํ์ฅ ๋ฐฉ๋ฒ์ ๋ง๋ค ๊ฒ์ ๋๋ค.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ : ์ด๊ฒ์ด ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ ๋ชฉ๋ก์ ์ถ๊ฐํ๊ณ ์ถ์ ๊ฒ์ ๋๊น? ๊ฐ์ ์ง๋ฌธ์ด ๋ฐ๋ณต๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
๋ชจ๋ ์ฌ์ฉ์ ์ ์ ์ค ํ๋์ ์ฌ์ฉ์ ์ ์์ ๋ํด ์ด์ ๋์์ ์ ํํ๋ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ๋ง์ต๋๊น?
์ด๊ฒ์ด ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ ๋ชฉ๋ก์ ์ถ๊ฐํ๊ณ ์ถ์ ๊ฒ์ ๋๊น?
๊ธ์, ๊ทธ๊ฒ์ ๋ฒ๊ทธ ์์ ์น์ ์ ์ธ๊ธ๋์ด ์์ต๋๋ค. ์ด๊ฒ์ ์ด์ ๋์์ด "๊ธฐ๋ฅ"์ผ๋ก ์ธ๊ธ๋ ์ ์ด ์๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋๋๋ค. ์คํ๋ ค, ๊ทธ๊ฒ์ ๋ฐ๋์งํ์ง ์์ ๋ถ์์ฉ์ด์๊ณ ๋ง์นจ๋ด ์ ๊ฑฐ๋์์ต๋๋ค ๐
๋ชจ๋ ์ฌ์ฉ์ ์ ์ ์ค ํ๋์ ์ฌ์ฉ์ ์ ์์ ๋ํด ์ด์ ๋์์ ์ ํํ๋ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ๋ง์ต๋๊น?
์๋์, ์ ๊ทผ ๋ฐฉ์์ ์์ ํ ์ฌ์์ ํ๊ธฐ ๋๋ฌธ์ ๋ฏฟ์ ์ ์๋ ๋ฐฉ๋ฒ์ ์์ต๋๋ค.
์ค๋ํซ์ ํ ์คํธํ๊ณ ์๋ํ๋ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ์ญ์์ค. ๋๋ ์ถ๊ฐ ์ง๋ฌธ์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์ ๐
์ธํฐํ์ด์ค์์๋ ์๋ํ๋๋ก ์์ ํ๊ณ 'Fixture.Customize์์ ์ฌ์ฉํ ์ ์๋๋ก ํ์ฅ ๋ฉ์๋๋ฅผ ๋ง๋ค์์ต๋๋ค.
@nphmuller ์ ๊ฐ ๋น์ ์ ๊น๋ํ๊ณ ๊น๋ํ ์ฝ๋๋ฅผ
์ ํ ๋น๋ํ์ง ์์ต๋๋ค. ๋น์ ์ ์ถ๋ก ์ ์๋ฒฝํ๊ฒ ์ดํดํ๊ณ ๋์ํ์ญ์์ค. ์ ์๊ฒ๋ ๊ทธ๋ฅ ์ ๋๋ค ๐
๋ ๊น๋ํ ๋ฐฉ๋ฒ์ด ์๋์ง ํ์ธํ๊ธฐ ์ํด ๋์ค์ ๋ฌธ์ ์ ๋ฐ์ด๋ค ์ ์์ต๋๋ค. ์ง๊ธ์ ๊ด์ฐฎ์ต๋๋ค.
๊ทธ๋ฅ ํธ๊ธฐ์ฌ์์ - ์ค์ ์ฌ์ฉ ์ฌ๋ก๋ ๋ฌด์์ ๋๊น? ๊ทธ๋ฐ ์ข ๋ฅ์ ๊ธฐ๋ฅ์ ๋ํ ์๊ตฌ๋ฅผ ์ถฉ์กฑํ ์ ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ ์คํธ๋ฅผ ์์ฑํ ๋ ๊ธฐ๋ณธ ๋๋ ์ธํฐํ์ด์ค ์ ํ์ ๊ตฌ์ฑํ์ง ์๊ณ ํน์ ์ ํ๋ง ์ฌ์ฉ์ ์ ์ํด์ผ ํฉ๋๋ค. ์ผ์ข ์ ๊ธ๋ก๋ฒ ์ฌ์ฉ์ ์ ์๋ฅผ ์์ฑํ๊ณ ์์ต๋๊น?
์ด ๊ฒฝ์ฐ AutoFixture๋ฅผ Entity Framework ํตํฉ ํ ์คํธ๋ฅผ ์ํ ํ ์คํธ ๋ฐ์ดํฐ ์์ฑ๊ธฐ๋ก ์ฌ์ฉํฉ๋๋ค.
๊ณตํต ์์ฑ์ ํฌํจํ๋ ์ํฐํฐ๊ฐ ์ฌ์ฉํ๋ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ ์ ํ ๋๋ ์ธํฐํ์ด์ค๊ฐ ์์ต๋๋ค. ID, ํ ๋ํธ ID(๋ฐ ํ์ ์์ฑ), ์ด์ ๊ฐ์ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด ์ด๋ฌํ ์์ฑ ์ค ํ๋๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ ์ฌ์ฉ์์ ๋๋ค. ์ด ์์ฑ์ ๋๋ถ๋ถ์ ํ ์คํธ์์ ๊ทธ๋ค์ง ํฅ๋ฏธ๋กญ์ง ์์ผ๋ฉฐ ์์ฑ๋ ๊ฒฝ์ฐ ์์ฑ๋์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฝ์ ๋์ด์ผ ํ๋ ๊ฑฐ๋ํ ๊ทธ๋ํ(User ํด๋์ค์๋ ๋ง์ ํ์ ์์ฑ์ด ์์)๊ฐ ์์ฑ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ์ฒด๊ฐ ๊ทธ๋ฐ ์์ผ๋ก ์ฝ์ ๋์ง ์์๊ธฐ ๋๋ฌธ์ ํ ์คํธ๊ฐ ๋๋ ค์ง๊ฑฐ๋ db ์์ค์์ ์คํจํ ์๋ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ด๋ฌํ ์์ฑ์ ์ ์ธํ๊ณ ํ์ํ ๋ ์ ํํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค. ๊ธฐ๋ณธ ํด๋์ค ์์ค์์ ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ชจ๋ ์ํฐํฐ ์ ํ์ ๋ํด ๋์ผํ ์๋ต ๊ท์น์ ์์ฑํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
@nphmuller ์ค๋ช