AutoConfiguredMoqCustomization์ ์ฌ์ฉํ ๋ ์ฌ์ฉ๋ ํฝ์ค์ฒ์์ ๋ฐํ๋ ๊ฐ์ด ์บ์๋๊ณ ๊ฐ ํธ์ถ๋ง๋ค ๋์ผํ ๊ฐ์ด ๋ฐํ๋ฉ๋๋ค(์ด ์์ ์ด MockType.ReturnsUsingContext์์ ์ํ๋๋์ง ๋๋ ๋ค๋ฅธ ๊ณณ์์ ์ํ๋๋์ง ํ์คํ์ง ์์ง๋ง ์ด์ ๋ํ ์ค๋ช ์ ๋ด ๋๋ค. 104๋ฒ ์ค์ ์์).
์ฌ์ ์ํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ํด๋น ๋ชจ์์ Frozen ์ธ์คํด์ค๋ฅผ ํ ์คํธ ๋ฉ์๋์ ์ ๋ฌํ๊ณ ๊ณ ์ ์ฅ์น๋ฅผ ํธ์ถํ๋ func๋ก ์ค์ ์ ์ฌ์ ์ํ๋ ๊ฒ์ ๋๋ค.
someMock.Setup(it => it.SomeMethodReturningAString()).Returns(() => fixture.Create<string>())
๊ฐ ํธ์ถ์ ์๋์ผ๋ก ์ค์ ํ๋ ๊ฒ ์ธ์ AutoFixture์์ ๊ฐ์ด ํ์ํ ๋๋ง๋ค ์กฐ๋ช ๊ธฐ๋ฅผ ํธ์ถํ๋๋ก ์๋ ์์ฑ๋ ๋ชจ์๋ฅผ ๊ตฌ์ฑํ๋ ๋ ์ผ๋ฐ์ ์ด๊ณ ์ค๋งํธํ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๊ฒฐ๊ณผ ๊ฐ์ ์บ์ฑํ๋ ์์ด๋์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๋ฉ์๋๋ฅผ _pure_ ๋ก ๋ง๋๋ ๊ฒ์ด
ํ ์คํธ ์ค์ธ ์์คํ ์ด ์์ ํจ์๋ฅผ ์์ํ์ง๋ง ์์ํ์ง ์์ ํจ์๊ฐ ์ ๊ณต๋๋ฉด ํ ์คํธ ๊ฒฐ๊ณผ ๊ฑฐ์ง ์์ฑ์ด ๋์ฌ ์ ์์ต๋๋ค. ์
// This method will return the expected result *if* `GetInt` is pure.
int Double(IDependency dep) {
return dep.GetInt() + dep.GetInt();
}
Assert.Equal(dep.GetInt * 2, Double(dep));
๋ฐ๋ฉด์ ํ ์คํธ ์ค์ธ ์์คํ ์ด ์๋๋ฅผ ๊ฐ์ ํ์ง ์๋ ๊ฒฝ์ฐ ์์ ๋๋ ๋ถ์ํ ๊ธฐ๋ฅ์ ๋ถ์ฌํด๋ ์๋ฌด๋ฐ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ด ๊ธฐ๋ฅ์ ๊ตฌํํ ๋ ์์ ํจ์๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด์์ต๋๋ค.
๊ฐ ํธ์ถ์ ์๋์ผ๋ก ์ค์ ํ๋ ๊ฒ ์ธ์ AutoFixture์์ ๊ฐ์ด ํ์ํ ๋๋ง๋ค ์กฐ๋ช ๊ธฐ๋ฅผ ํธ์ถํ๋๋ก ์๋ ์์ฑ๋ ๋ชจ์๋ฅผ ๊ตฌ์ฑํ๋ ๋ ์ผ๋ฐ์ ์ด๊ณ ์ค๋งํธํ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
_one_ ๋ฉ์๋์ ๋ํด ์ด ์์
์ ์ํํด์ผ ํ์ง๋ง ์ฌ๋ฌ ํ
์คํธ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ IConfiguration
๋ฃ์ ๊ฒ์
๋๋ค.
์ฌ๋ฌ ํ ์คํธ์์ ๋ชจ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ด ์์ ์ ์ํํ๋ ค๋ฉด ์กฐ๊ธ ๋ ๋ง์ ์์ ์ด ํ์ํฉ๋๋ค.
ReturnsUsingContext
์ ์ ๊ตฌํ์ ์ ์ํฉ๋๋ค(IIRC, ํ์ฌ ๊ตฌํ์ ๋ณต์ฌํ๊ณ 104ํ์ ์ ๊ฑฐํ๋ฉด ๋ฉ๋๋ค).MockVirtualMethodsCommand
์ฌ์ ์ํ๊ณ ReturnsUsingContext
์ ๋ํ ํธ์ถ์ ์ ๋ฉ์๋์ ๋ํ ํธ์ถ๋ก ๋ฐ๊ฟ๋๋ค.AutoConfiguredMoqCustomization
์ฌ์ ์ํ๊ณ MockVirtualMethodsCommand
์ ์ธ์คํด์คํ๋ฅผ ์ ํด๋์ค์ ์ธ์คํด์คํ๋ก ๋ฐ๊ฟ๋๋ค.์ฐ๋ฆฌ๋ ์ด ๋์์ ๊ตฌ์ฑํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๊ฐํ ์๋ ์์ง๋ง ์ด๋ฅผ ์ ๋นํํ ๋งํผ ์์๊ฐ ๋์์ง ํ์คํ์ง ์์ต๋๋ค. ์ ์๊ฐ์๋ ์ด๋ฌํ ๋ณ๊ฒฝ์ ๊ฐ๋ณ๊ฒ ์ฌ๊ฒจ์๋ ์ ๋ฉ๋๋ค. ์ธ๋ถํ๋ ์ฌ์ฉ์ ์ง์ ์ ์ฐ๋ฐ์ ์ธ ๋ณต์ก์ฑ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. @ploeh , ์ด์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น?
ํ
์คํธ ๋๋ธ์ด ๋ฐํ ๊ฐ์ ์ป๊ธฐ ์ํด AutoFixture๋ก ๋ค์ ํธ์ถํ๋๋ก ๊ตฌ์ฑ๋์ด ์๋ค๊ณ ์๊ฐํ์์ ์ธ์ ํฉ๋๋ค. AutoFixture์๋ ์ด๋ฏธ ์๋ช
๊ด๋ฆฌ ๋ฉ์ปค๋์ฆ์ด ์์ผ๋ฏ๋ก(์ ์ง ๊ธฐ๋ฅ์ ํตํด) AutoConfiguredMoqCustomization
๊ฐ ์์ฒด ์๋ช
๊ด๋ฆฌ์๋ฅผ ๊ตฌํํ์ฌ AutoFixture ์์ฒด๊ฐ ์ ๊ณตํ๋ ์ปจํธ๋กค ํ๋ฉด์ ๋ฌด์ํ๋ค๋ ๊ฒ์ด ์ฝ๊ฐ ๋๋์ต๋๋ค.
์์ฃผ ์ข์ ์ง์ ์
๋๋ค. Freeze
๋ํด ๊ทธ๋ฐ ์์ผ๋ก ์๊ฐํ ์ ์ด ์์ต๋๋ค. ์ด์ ์ฌ์ฉ์ ์ ์์ ๋์์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ํ๊ธฐ์ ์ธ ๋ณ๊ฒฝ์ด ๋ ๊ฒ์
๋๋ค. ์ ์๊ฐ์๋... AutoFixture v4์์ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ์ญ๋๊น?
ํ ์คํธ์์ ๋ฌธ์ํํ๊ฑฐ๋ ์ด๋ป๊ฒ๋ '์ฝ์'ํ ๋์์ ๋๊น?
๋๋๊ฒ๋, ์๋๋๋ค. ๋๋ ๋ด๊ฐ ์ด๊ฒ์ ๋ฎ์๋ค๊ณ ๊ฝค ํ์ ํ์ง๋ง, ๋๋ ๊ทธ๋ ์ง ์์ ๊ฒ ๊ฐ๋ค. ์ ์ด๋ ๋๋ ์ด๊ฒ์ ๋ค๋ฃจ๋ ์ด๋ค ํ ์คํธ๋ ์ฐพ์ ์ ์์๊ณ , ๊ทธ ๋ผ์ธ์ ์ ๊ฑฐํด๋ ์ด๋ค ํ ์คํธ๋ ์คํจํ์ง ์์๋ค. ๊ทธ๋ฌ๋ IMO๋ ์ฌ์ ํ ๊ด์ฐฐ ๊ฐ๋ฅํ ๋์์ด๋ฉฐ ์ด์ ์์กดํ๋ ์ฝ๋๊ฐ ์์ ์ ์์ต๋๋ค...
๊ณต์ ํ ํฌ์ธํธ. ์ง๊ธ ํ๋์ ๊ฐ์ผ๋ก ์ค์ ํ ๋ค์ AutoFixture 4๋ก ์ ํํ ๋ ์ ํํ๋ ๊ตฌ์ฑ ๊ฐ์ด ๋ ์ ์์ต๋๊น?
๋์. ์ด๋ฌํ ๋งฅ๋ฝ์์ "๊ตฌ์ฑ ๊ฐ"์ ์ ํํ ๋ฌด์์ ์๋ฏธํฉ๋๊น? MockType
ํด๋์ค ๋ด๋ถ์ const๋ก ๋ค์ด ์ฌ๋ฆฌ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๊น? ์: private const bool cacheReturnValues = true
๋ค์ if(cacheReturnValues) /**/
๊ทธ๊ฒ์ ์ฝ๊ฐ์ ์ผํ์ฉ ๋๊ธ์ด์์ต๋๋ค. ์ธ์ ํฉ๋๋ค. ๊ทธ๋์ ๋๋ฌด ๋ง์ ๋ณ๊ฒฝ ์์ด๋ ์ค์ ๋ก ๊ฐ๋ฅํ์์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ์๋ฏธํ ๋ฐ๋ ์ด๋ฌ์ต๋๋ค.
@andreasnilsen ์ ์ง๊ธ ๋์์ ๋ณ๊ฒฝํ๊ณ ์ถ์ง๋ง ์ด๊ฒ์ด ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ง๋ค๋ฉด @andreasnilsen ์๊ฒ ์ง๊ธ ๋์์ ๋ณ๊ฒฝํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๊ณ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ๋ ์ค๋จํ์ง ์์ต๋๋ค.
AutoFixture 4๋ฅผ ๋์ ํ ๋ ๊ธฐ๋ณธ ๊ตฌ์ฑ์ ๋ณ๊ฒฝํ์ฌ ๊ธฐ๋ณธ ๋์์ด ๋ฐํ ๊ฐ์ด ์บ์๋์ง ์๋๋ก ํฉ๋๋ค. ์๋๋ฉด ๋จ์ํ ํด๋น ์ต์ ์ ์ ๊ฑฐํ ์๋ ์์ต๋๋ค...
๋ถ์ธ cacheReturnValues
์ ๊ฐ์ ๊ฒ์ด ์ด๋ฅผ ์ํํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ ์ ์์ง๋ง ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋๋ก ํด์ผ ํ๋ฏ๋ก private
๋ ์ ์์ต๋๋ค.
(์ฐ๋ฆฌ๋ ์ ํํ ๋ ๊ฐ์ ๊ฐ์ด์์ ๊ฑฐ๋ผ๋ ํ์ ์๋๋ผ๋ฉด ๋ํ, ์ฐ๋ฆฌ๋ ๊ณ ๋ คํด์ผ enum
๋์ ์ bool
.)
์, ์ฒ์์๋ v4์์ ๋ฐ๊ฒฌํ๊ณ ๋ณ๊ฒฝํ๊ธฐ ์ฌ์ด ๋ด๋ถ ํ๋๊ทธ๋ฅผ ์๋ฏธํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋ง์์ ์ค๋ ์ฒ์ ๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
AutoConfiguredMoqCustomization
์ ์์ฑ์์ ๋ถ์ธ ๋งค๊ฐ๋ณ์(์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ํด ์ ํ์ฌํญ)๋ฅผ ์ถ๊ฐํ๊ธฐ MockVirtualMethodsCommand
ํ๋ฉด MockType.ReturnsUsingContext
๋ก ์ ํ๋ฉ๋๋ค. ์ด๊ฒ์ ๋ณด์ธ๋ค:๋๋ ์ฐ๋ฆฌ๊ฐ ํํํ๊ณ ๋์ค์ ๊ณ ์ฐฉ๋ ์ ์๋ ๋์์ธ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๊ฒ์ ๊ฒฝ๊ณํ๋ฏ๋ก ์ด ํ๋ก์ ํธ๋ฅผ ์ ์งํ๋ ๊ทํ์ ์ ๋ฌธ ์ง์/๊ฒฝํ์ ๋์ด ํ๊ฐํ ๊ฒ์ ๋๋ค.
์ ๋ต ๊ฐ์ ๊ฑธ ์๊ฐํ๊ณ ์์๋๋ฐ...
์ ๋ฌผ๋ก ์ด์ฃ ! "๊ตฌ์ฑ ๊ฐ"์ ์ง์ฐฉํ๊ณ ํ ๊ฑธ์ ๋ฌผ๋ฌ๋๋ ๊ฒ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ต๋ณ์ด ๋ฆ์ด์ ์ฃ์กํฉ๋๋ค. ์ ์ ์ด ๋ฉํด์ก์ต๋๋ค. ๊ณง ์ดํด๋ณด๊ณ ๋์์ธ ์ ์์๋ก ๋์์ค๊ฒ ์ต๋๋ค.
์ต๊ทผ์ ์ฐ๋ฆฌ๋ ์ฌ์ฉ์ ์ ์ ์กฐ์ ์ ์ํ ์์ฑ์ ์ฌ์ฉํ๊ธฐ ์ํด ์ฌ์ฉ์ ์ ์ ๋ฆฌํฉํ ๋ง์ ์ํํ์ต๋๋ค. ์ ์ฌ์ ์ผ๋ก ์ด ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ด๋ ์ ์์ต๋๋ค(๋ ๋์ ์ค์ ์ด๋ฆ ์ฐพ๊ธฐ).
c#
new AutoMoqCustomization { CacheCallResults = false }
๋ด๋ถ์ ์ผ๋ก๋ ์์์ ์กฐ์ธํ ๊ฒ๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ ๋ต์ ํตํด ์ด๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
์ด๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ๋น๊ต์ ๊ฐ๋จํด์ผ ํ๋ฏ๋ก ํ๊ทธ์์ ์ ํ๋ก ํ์ํฉ๋๋ค.
@zvirja ๊ฐ ์ ๋ฅผ ์กฐ๊ธ ๋์ ์๋์? ๊ทธ๋ฆฌ๊ณ ์ ๊ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ด๋์๋ถํฐ ์์ํด์ผํ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค :)
@micheleissa ๊ด์ฌ ๊ฐ์ฌํฉ๋๋ค! AutoMoq
์์ค ์ฝ๋๋ฅผ ์ฝ๊ณ ๋ด๋ถ ๋ฉ์ปค๋์ฆ์ ์ดํดํ๊ธฐ ์ํด ๋๋ฒ๊น
ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์์ฃผ ์์์ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ์ง๋ ์์ํ
๋ฐ...
๋ ๊ตฌ์ฒด์ ์ธ ์ง๋ฌธ์ด ์์ผ๋ฉด ์ง๋ฌธํ์ญ์์ค ๐
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
ํ ์คํธ ๋๋ธ์ด ๋ฐํ ๊ฐ์ ์ป๊ธฐ ์ํด AutoFixture๋ก ๋ค์ ํธ์ถํ๋๋ก ๊ตฌ์ฑ๋์ด ์๋ค๊ณ ์๊ฐํ์์ ์ธ์ ํฉ๋๋ค. AutoFixture์๋ ์ด๋ฏธ ์๋ช ๊ด๋ฆฌ ๋ฉ์ปค๋์ฆ์ด ์์ผ๋ฏ๋ก(์ ์ง ๊ธฐ๋ฅ์ ํตํด)
AutoConfiguredMoqCustomization
๊ฐ ์์ฒด ์๋ช ๊ด๋ฆฌ์๋ฅผ ๊ตฌํํ์ฌ AutoFixture ์์ฒด๊ฐ ์ ๊ณตํ๋ ์ปจํธ๋กค ํ๋ฉด์ ๋ฌด์ํ๋ค๋ ๊ฒ์ด ์ฝ๊ฐ ๋๋์ต๋๋ค.