์๋ ํ์ธ์,
AutoMoqData์์ ์์ฑํ ๋ด๋ถ Mocked Interface์ ์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ์ ์ธํฐํ์ด์ค๋ฅผ ์ค์ ํ๋ ค๊ณ ํฉ๋๋ค.
์ด๋ฐ ์์ผ๋ก ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋์
[Theory, AutoMoqData]
public void Dummy(IFixture fixture, ComplexClassWithInnerInterface sut)
{
fixture.GetInstance<IInnerInterfaceMockCreatedByAutoMoqData>().Setup(x => x.Method).Result(something);
Assert.Equal(String.Empty, String.Empty);
}
๊ฐ์ฌ ํด์
๋ ธ๋ ฅํ๋ค
Mock.Get(sut).Setup(x => x.Method).Result(something);
Moq์ ์ํด ์์ฑ๋์ง ์์ Object ์ธ์คํด์ค๊ฐ ํ์๋ฉ๋๋ค. ์ก์ธ์ค ์.
์ธํฐํ์ด์ค๊ฐ ๊ณต์ฉ ์์ฑ์ ์์ผ๋ฉด ์ค์ ๋ก ์๋ํฉ๋๋ค.
Mock.Get(sut.InnerInterface).Setup(x => x.Method).Result(๋ฌด์ธ๊ฐ);
๊ทธ๋ฌ๋ ์ธํฐํ์ด์ค๊ฐ ์กฐ๋กฑ๋๊ณ ์์ฑ์๊ฐ ์ฃผ์ ๋๊ณ IoC ์ปจํ ์ด๋์ ๋ฑ๋ก๋์์ง๋ง ๊ณต์ฉ ์์ฑ์ ์ฌ์ฉํ์ฌ sut์์ ์ก์ธ์คํ ์ ์๋ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ๋ ๊น์?
์ด ๊ฒฝ์ฐ ์์ฑํ ์ธ์คํด์ค๋ sut์ ์ฃผ์ ๋๋๋ก ๋ชจ์๋ฅผ ๋๊ฒฐํด์ผ ํฉ๋๋ค.
[Theory, AutoMoqData]
public void Dummy(
IFixture fixture,
[Frozen]Mock<YourInnerInterface> innerInterfaceMock,
ComplexClassWithInnerInterface sut)
{
innerInterfaceMock.Setup(x => x.Method).Result(something);
sut.DoSomething();
Assert.Equal(String.Empty, String.Empty);
}
sut๊ฐ ์์ฑ๋ ๋ ์ด๋ฏธ ์กด์ฌํ๊ณ ๋ฐ๋ผ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฃผ์ ๋๋๋ก sut ์ ์ frozen mock์ ํญ์ ์์ฑํ๋๋ก ์ฃผ์ํ์ญ์์ค.
์ฐธ์กฐ๋ฅผ ์ํด ploeh์ ๋ธ๋ก๊ทธ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์๋
ํ์ธ์,
๋๋ ์ด๋ฏธ ๊ทธ๋ ๊ฒ ํ๊ณ ์์๋ค. ๊ทธ๋ฌ๋ 30๊ฐ ์ธํฐํ์ด์ค์ ๊ฒฝ์ฐ ๋ฉ์๋ ๋งค๊ฐ๋ณ์์ ํฌํจํ๋ ๊ฒ์ ๊ฝค ๋ณด๊ธฐ ํํฉ๋๋ค.
๊ทํ์ ์ฝ๋๋ AutoMoqData๊ฐ ๋ชจ๋ ๋ชจ์ ์ธํฐํ์ด์ค๋ฅผ ๋๊ฒฐํ์ง ์๋๋ค๋ ๊ฒ์ ์๊ธฐ์์ผฐ์ต๋๋ค. ๋ฐ๋ผ์ ์กฐ๋ช
๊ธฐ์ ์ปจํ
์ด๋์์ ์๋์ผ๋ก ์์ฑ๋ ๋ชจ์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํด ๋ณด์
๋๋ค. ๊ทธ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฃผ์
๋์ง ์์ผ๋ฏ๋ก ๊ณ ์ ์ฅ์น์ GetInstance์ ๊ฐ์ ๋ฉ์๋๊ฐ ์๋ ๊ฒฝ์ฐ ์๋ ์์ฑ๋ ๋ชจ์์ ๋ํด ์๋ฌด ๊ฒ๋ ๋ฐํํ์ง ์์ต๋๋ค. ์ด๊ฒ์ด ํฝ์ค์ณ ์ธ์คํด์ค๋ก ๋ชจ์๋ฅผ ๊ณ ์ ํ๋ฉด ์ค๋ณต๋๋ ์ด์ ์
๋๋ค. ๋ด๊ฐ ๋ณผ ์์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ sut๊ฐ ๋์ค์ ๊ณ ์ ๋ ๋ชจ์๋ก ์
๋ฐ์ดํธ ๋ ์ ์๋ค๋ฉด ์ถ์
ํ ๊ฒ์
๋๋ค. ์ฌ์ด ๋ฐฉ๋ฒ์ AutoMoqData๋ฅผ ์ฌ์ฉํ์ฌ IFixture๋ฅผ ๋ง๋ค๊ณ ํ
์คํธ ๋ฉ์๋์์ ๋ชจ์๋ฅผ ๊ณ ์ ํ๊ณ ์ค์ ํ ๋ค์ sut๋ฅผ ๋ง๋๋ ๊ฒ์
๋๋ค. ์ด ์ค์ ์ ์ฌ์ฉํ๋ฉด ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋์ฐ๋ฏธ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด ๋ชจ์๋ฅผ ๊ณ ์ ํ๊ณ ์ค์ ํ ์ ์์ต๋๋ค.
๊ฐ์ฌ ํด์
ํ๋ฅญํ ๋ต๋ณ์ ๋ํด @xlecoustillier ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํ ์คํธ์์ ์ด ํจํด์ ์ง์์ ์ผ๋ก ๋ฐ๋ฅด๊ณ ์์ผ๋ฏ๋ก ๋์ผํ ์์ ์ ์ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ทธ๋ฌ๋ 30๊ฐ ์ธํฐํ์ด์ค์ ๊ฒฝ์ฐ ๋ฉ์๋ ๋งค๊ฐ๋ณ์์ ํฌํจํ๋ ๊ฒ์ ๊ฝค ๋ณด๊ธฐ ํํฉ๋๋ค.
๊ธ์์, ์ด ์ฃผ์ฅ์ ์ข ์ด์ํด ๋ณด์ ๋๋ค. ์๋ง, ํ ์คํธ ์ฝ๋์ ๋์์ธ๊ณผ ๊ทธ๊ฒ์ ๋ญ๊ฐ ์๋ชป ๋น์ ์ด ์๋๋ฆฌ์ค ๐ ๋ ๋น์ ์ด ๋ ์งํํ๊ธฐ ์ ์ ์ฝ๋๋ฅผ ๋จผ์ ๊ฒํ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค ๊ฒ์ ๋๋ค @ploeh 99 % ํด์ ์ ์๋๋ก ๊ตฌ์ฑ 30 ์ข ์์ฑ์ ํ์๋กํ๋ ๊ฒฝ์ฐ, ๊ทธ์ ์กฐ์ธ์ ๋ฐ๋ผ ๊ทธ๊ฒ์ ๊ฐ์ง๊ณ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค ์ต๋ 3-4๊ฐ์ ์ข ์์ฑ ๐
๋ฐ๋ผ์ ์กฐ๋ช ๊ธฐ์ ์ปจํ ์ด๋์์ ์๋์ผ๋ก ์์ฑ๋ ๋ชจ์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํด ๋ณด์ ๋๋ค. ๊ทธ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฃผ์ ๋์ง ์์ผ๋ฏ๋ก ๊ณ ์ ์ฅ์น์ GetInstance์ ๊ฐ์ ๋ฉ์๋๊ฐ ์๋ ๊ฒฝ์ฐ ์๋ ์์ฑ๋ ๋ชจ์์ ๋ํด ์๋ฌด ๊ฒ๋ ๋ฐํํ์ง ์์ต๋๋ค.
๋ด๊ฐ ์ ์ฒด ๋ฉ์์ง๋ฅผ ๋ช
ํํ๊ฒ ์ดํดํ๋ค๊ณ 100% ํ์ ํ ์๋ ์์ง๋ง ๋ด๊ฐ ์ป์ ์ ๋ณด์์ ๋น์ ์ด ์ณ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ๋ ๋ชจ๋ ๊ฐ์ฒด๋ ์ผ์์ ์ด๋ฉฐ fixture
์ ๊ฐ์ฒด๋ฅผ ๋ณด์กดํ์ง ์์ต๋๋ค. ํน์ ๊ฐ์ฒด๋ฅผ ์ฑ๊ธํค์ผ๋ก ๋ง๋ค๋ ค๋ฉด fixture.Freeze<>()
API ๋๋ [Frozen]
์์ฑ ๋๋ ๊ธฐํ ์ ์ ํ API๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๊ธฐ์กด ๊ธฐ๋ณธ ๋์์ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๋ฅผ ๋ค๋ฃจ๋๋ก ์ค๊ณ๋์์ผ๋ฉฐ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ ํ๋ณ๋ก ๋์ผํ ๊ฐ์ฒด๋ฅผ _์ํ์ง ์์ต๋๋ค_.
์ฌ์ ํ ์ฐ๋ฆฌ ์ธก์ ๋์์ ์ฐพ๊ณ ์๋ค๋ฉด ๋ ์ ํํ ์๊ตฌ ์ฌํญ์ ์ ๊ณตํ์ญ์์ค. ๋ ๋์, ํ์ฌ์ ํ๊ณ์ ๋ฌ์ฑํ๊ณ ์ ํ๋ ๋ชฉํ๋ฅผ ๋ณด์ฌ์ค ์ ์๋ ์ถฉ๋ถํ ์ฝ๋๋ฅผ ๊ณต์ ํ์ธ์. ๊ทธ๋ฌ๋ฉด ๋ ๋์ ๋๊ธฐํ์ ๋์์ด ๋ ๊ฒ์ ๋๋ค ๐
๊ฐ์ฌ ํด์.
์, 30๊ฐ์ ์ข ์์ฑ์ด ๋๋ฌด ๋ง๋ค๊ณ ์ ์ํฉ๋๋ค.
์ฃผ์
๋ ์ข
์์ฑ์ ์ป๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ @xlecoustillier๊ฐ ์ ์ํ ๊ฒ์ฒ๋ผ [Frozen]
์์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํ๋์ ์ต์
์ด๋ฉฐ ์ค์ ๋ก ์์ฑ์ด ์๋ ์กด์ฌํ๋ ์ด์ ์
๋๋ค.
Mock.Get(sut.Dep1)
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ ์ ๊ฐ ์์ฃผ ์ฌ์ฉํ๋ ์ต์
์
๋๋ค.
๊ทธ๋ฌ๋ ์ธํฐํ์ด์ค๊ฐ [...] ์์ฑ์ ์ฃผ์ [...]์ด์ง๋ง ๊ณต์ฉ ์์ฑ์ ์ฌ์ฉํ์ฌ su์์ ์ก์ธ์คํ ์ ์๋ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ๋ ๊น์?
๊ทธ๋ ๋ค๋ฉด ์์ฑ์ผ๋ก ๋ ธ์ถํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋น์ ์ด ์๊ณกํ ๊ฒ์ ๋ ธ์ถํ ์๋ ์์ต๋๋ค. . ๊ทธ๊ฒ์ ๋ ธ์ถ์ํค๊ธฐ ์ํด ์บก์ํ๋ฅผ ๊นจ๋จ๋ฆฌ์ง ์์ต๋๋ค.
๊ฐ์ฅ ์ข์ ์ ๊ทผ ๋ฐฉ์์ ๊ตฌํ์ ๋์ถํ๋ ๊ฒ ์ด์์ ์๋ ์ถ์ํ๋ฅผ ๊ฐํํ์ง ์๊ณ ์ข ์์ฑ์ ํด๋์ค ์์ฑ์ผ๋ก ๋ ธ์ถํ๋ ๊ฒ์ด๋ผ๊ณ ์ง์ ํ์ฌ @ploeh ๋ฅผ ์ถ๊ฐํ๊ณ
@malylemire1 ๋ ์ด์ ๋์์ด ํ์ํ์ง ์์ ๊ฒ
ํ ๋ฒ ๋ ์ง๋ฌธํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ๐
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
ํ๋ฅญํ ๋ต๋ณ์ ๋ํด @xlecoustillier ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํ ์คํธ์์ ์ด ํจํด์ ์ง์์ ์ผ๋ก ๋ฐ๋ฅด๊ณ ์์ผ๋ฏ๋ก ๋์ผํ ์์ ์ ์ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ธ์์, ์ด ์ฃผ์ฅ์ ์ข ์ด์ํด ๋ณด์ ๋๋ค. ์๋ง, ํ ์คํธ ์ฝ๋์ ๋์์ธ๊ณผ ๊ทธ๊ฒ์ ๋ญ๊ฐ ์๋ชป ๋น์ ์ด ์๋๋ฆฌ์ค ๐ ๋ ๋น์ ์ด ๋ ์งํํ๊ธฐ ์ ์ ์ฝ๋๋ฅผ ๋จผ์ ๊ฒํ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค ๊ฒ์ ๋๋ค @ploeh 99 % ํด์ ์ ์๋๋ก ๊ตฌ์ฑ 30 ์ข ์์ฑ์ ํ์๋กํ๋ ๊ฒฝ์ฐ, ๊ทธ์ ์กฐ์ธ์ ๋ฐ๋ผ ๊ทธ๊ฒ์ ๊ฐ์ง๊ณ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค ์ต๋ 3-4๊ฐ์ ์ข ์์ฑ ๐
๋ด๊ฐ ์ ์ฒด ๋ฉ์์ง๋ฅผ ๋ช ํํ๊ฒ ์ดํดํ๋ค๊ณ 100% ํ์ ํ ์๋ ์์ง๋ง ๋ด๊ฐ ์ป์ ์ ๋ณด์์ ๋น์ ์ด ์ณ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ๋ ๋ชจ๋ ๊ฐ์ฒด๋ ์ผ์์ ์ด๋ฉฐ
fixture
์ ๊ฐ์ฒด๋ฅผ ๋ณด์กดํ์ง ์์ต๋๋ค. ํน์ ๊ฐ์ฒด๋ฅผ ์ฑ๊ธํค์ผ๋ก ๋ง๋ค๋ ค๋ฉดfixture.Freeze<>()
API ๋๋[Frozen]
์์ฑ ๋๋ ๊ธฐํ ์ ์ ํ API๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.๊ธฐ์กด ๊ธฐ๋ณธ ๋์์ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๋ฅผ ๋ค๋ฃจ๋๋ก ์ค๊ณ๋์์ผ๋ฉฐ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ ํ๋ณ๋ก ๋์ผํ ๊ฐ์ฒด๋ฅผ _์ํ์ง ์์ต๋๋ค_.
์ฌ์ ํ ์ฐ๋ฆฌ ์ธก์ ๋์์ ์ฐพ๊ณ ์๋ค๋ฉด ๋ ์ ํํ ์๊ตฌ ์ฌํญ์ ์ ๊ณตํ์ญ์์ค. ๋ ๋์, ํ์ฌ์ ํ๊ณ์ ๋ฌ์ฑํ๊ณ ์ ํ๋ ๋ชฉํ๋ฅผ ๋ณด์ฌ์ค ์ ์๋ ์ถฉ๋ถํ ์ฝ๋๋ฅผ ๊ณต์ ํ์ธ์. ๊ทธ๋ฌ๋ฉด ๋ ๋์ ๋๊ธฐํ์ ๋์์ด ๋ ๊ฒ์ ๋๋ค ๐
๊ฐ์ฌ ํด์.