๋ด๊ฐ ์๋ ํ, AutoFixture๋ ์๋์ผ๋ก ์ธํฐํ์ด์ค์ ์ถ์ ์ ํ์ mockable๋ก ์ทจ๊ธํฉ๋๋ค. ์ด ๋ชฉ๋ก์ ๋๋ฆฌ์ ์ ํ๋ ํฌํจํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋จผ์ ์ด๋ค ๋ชจ์ ํ๋ ์์ํฌ๋ก ์์ ํ๋์ง ๋ช ํํ ํด์ฃผ์ค ์ ์์ต๋๊น? ๋ช ๊ฐ์ง ํตํฉ(Moq, NSubsitute, FakeItEasy)์ด ์์ผ๋ฏ๋ก ๋ช ํํ์ง ์์ต๋๋ค. ๋ด๊ฐ ์๋ ํ, ๋๋ฆฌ์๋ ์ด๋ฏธ Moq ํตํฉ์์ ์ง์๋ฉ๋๋ค(์ ์ด๋ #742์์ ์ธ๊ธ๋จ).
๋ํ ๋ด๊ฐ ์๋ ํ AutoFixture์๋ ์์ฒด ๋๋ฆฌ์ ์์ฑ ๋ฉ์ปค๋์ฆ์ด ์์ต๋๋ค. ๋ฌธ์ ๊ฐ ์์ต๋๊น?
@zvirja ์ ๋
๋ค์ ์ฝ๋๋ ์ฌ์ฉ์ ์ง์ ์ด ์ ์ฉ๋ ํ Fake๋ฅผ ๋ฐํํฉ๋๋ค.
var myFake= fixture.Create<ISomeInterface>();
๊ทธ๋ฌ๋ ๋ค์์ ๊ทธ๋ ์ง ์์ต๋๋ค.
var myFake= fixture.Create<Func<int,int>>();
์์ ์ฝ๋๋ ๊ฐ์ง๊ฐ ์๋ ๋๋ฏธ ๋๋ฆฌ์๋ฅผ ๋ฐํํฉ๋๋ค.
๋ ๋์๊ฐ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
var myFake= fixture.Create<Fake<Func<int,int>>>();
AutoFixture.ObjectCreationExceptionWithPath
H๊ฒฐ๊ณผ=0x80131500
Message=์์ธ์ ํจ๊ป ์์ฑ์ด ์๊ธฐ์น ์๊ฒ ์คํจํ๊ธฐ ๋๋ฌธ์ AutoFixture๊ฐ System.IntPtr์์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์คํจ์ ๊ทผ๋ณธ ์์ธ์ ์กฐ์ฌํ๋ ค๋ฉด ๋ด๋ถ ์์ธ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.์์ฒญ ๊ฒฝ๋ก:
FakeItEasy.Fake1[System.Func
2[System.Int32,System.Int32]]
IntPtr ๋ฉ์๋
System.IntPtr๋ด๋ถ ์์ธ ๋ฉ์์ง:
AutoFixture.Kernel.IllegalRequestException: IntPtr์ ๋ํ ์์ฒญ์ด ๊ฐ์ง๋์์ต๋๋ค. ์ด๊ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ๋ก์ธ์ค๋ฅผ ์ค๋จ์ํค๋ ์์ ํ์ง ์์ ๋ฆฌ์์ค์ด๋ฏ๋ก ์์ฒญ์ด ๊ฑฐ๋ถ๋ฉ๋๋ค. IntPtr ์์ฒญ์ ์ผ๋ฐ์ ์ธ ์์ค๋ Func์ ๊ฐ์ ๋๋ฆฌ์์ ๋ํ ์์ฒญ์ ๋๋ค.๋๋ ์กฐ์น . ์ด ๊ฒฝ์ฐ ์์๋๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ์ ํ ์์ฑ ์ ๋ต์ ์ง์ ํ์ฌ ๋ฌธ์ ๊ฐ ์๋ ์ ํ์ ์ฌ์ฉ์ ์ง์ (๋ฑ๋ก ๋๋ ์ฝ์ )ํ๋ ๊ฒ์ ๋๋ค. ์ถ์ฒ=
์คํ ์ถ์ :๋ด๋ถ ์์ธ 1:
IllegalRequestException: IntPtr์ ๋ํ ์์ฒญ์ด ๊ฐ์ง๋์์ต๋๋ค. ์ด๊ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ๋ก์ธ์ค๋ฅผ ์ค๋จ์ํค๋ ์์ ํ์ง ์์ ๋ฆฌ์์ค์ด๋ฏ๋ก ์์ฒญ์ด ๊ฑฐ๋ถ๋ฉ๋๋ค. IntPtr ์์ฒญ์ ์ผ๋ฐ์ ์ธ ์์ค๋ Func์ ๊ฐ์ ๋๋ฆฌ์์ ๋ํ ์์ฒญ์ ๋๋ค.๋๋ ์กฐ์น . ์ด ๊ฒฝ์ฐ ์์๋๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ์ ํ ์์ฑ ์ ๋ต์ ์ง์ ํ์ฌ ๋ฌธ์ ๊ฐ ์๋ ์ ํ์ ์ฌ์ฉ์ ์ง์ (๋ฑ๋ก ๋๋ ์ฝ์ )ํ๋ ๊ฒ์ ๋๋ค.
@OnurGumus ์ด ๋ฌธ์ ๋ฅผ ๊ฐ๋จํ ์กฐ์ฌํ๋๋ฐ FakeItEasy
๊ฐ ๋๋ฆฌ์ ์กฐ๋กฑ์ ์ง์ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ฆฌ์ธ ์ ๋ฌธ์์ ์์ง ์์ต๋๋ค .
๋ํ ๋ค์ ์ฝ๋๋ฅผ ํ
์คํธํ์ง๋ง ์์ธ์ ํจ๊ป ์คํจํ์ต๋๋ค(๊ธฐ๋ฅ์ด ์ง์๋์ง ์์์ ์ฆ๋ช
ํจ).
c#
A.Fake<Func<int, int>>();
๋ฐ๋ผ์ AutoFixture๋ ์ด์ ๋ํด ๋ญ๊ฐ๋ฅผ ํ ์ ์๋ ๊ฒ ๊ฐ์ง ์์ต๋๋ค.
์ํ๋ ๋์์ ๋ ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น? ๊ธฐ๋ณธ ๋๋ค ํํ์์ ํตํด ์ง์ ํ ์ ์์ผ๋ฏ๋ก ๋๋ฆฌ์๋ฅผ ๋ชจ์ํ๋ ๊ฒ์ ๋งค์ฐ ์ฝ์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ ๋ชจ์๊ฐ ํ์ํฉ๋๊น?
@zvirja , FakeItEasy๋ ํ์คํ ๋๋ฆฌ์ธ์ ์ํ Fakes๋ฅผ ์ง์ํฉ๋๋ค.
@blairconrad ์ ์ ์๊ฐ์ ์ค๋ช ํด ์ฃผ ์๊ฒ ์ต๋๊น? FakeItEasy๋ ๋๋ฆฌ์ ์กฐ๋กฑ์ ์ง์ํฉ๋๊น? ๊ทธ๋ ๋ค๋ฉด ๊ตฌ๋ฌธ์ ๋ฌด์์ ๋๊น? ์์ ์ํ์ ์คํจํ์ง๋ง ๋ญ๊ฐ ๋์น ์ผ์ด ๋ฐ์ํ ์ ์์ต๋๋ค... :ํผ๋:
๊ฐ์ฌํฉ๋๋ค:์ํฌ:
@zvirja , ๋ฐ๊ฐ์ต๋๋ค. @OnurGumus๊ฐ ๋งํ๋ฏ์ด, FakeItEasy ํ๋ณต ๊ฐ์ง ๋์์ (๋๋์ด ๋ฌธ์์ ๋ฌธ์ ๋ฅผ ๋ง๋ค์์ต๋๋ค)ํฉ๋๋ค.
๊ทธ๋ฌ๋ AutoFakeItEasy๋ ๋๋ฆฌ์ธ์ ์์กฐํ๋ ๊ฒ์ ๊ฒฐ์ฝ ๊ท์ฐฎ๊ฒ ํ ์ ์ด ์์ต๋๋ค.
์๋ฅผ ๋ค์ด Fake<Func<int, int>>
๋ฅผ ๊ฐ์ฅํ ๋ T
๊ฐ ๋๋ฆฌ์์ธ Fake<T>
๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ์ง ์๊ธฐ ๋๋ฌธ์ FakeItEasyMethodQuery.SelectMethods
์คํจํฉ๋๋ค. ์๋์ ๋งค์ฐ ์์งํ ๋ณ๊ฒฝ์ด ์ด๊ฒ์ ์์ ํฉ๋๋ค.
@@ -33,7 +33,7 @@ namespace Ploeh.AutoFixture.AutoFakeItEasy
}
var fakeType = type.GetFakedType();
- if (fakeType.IsInterface)
+ if (fakeType.IsInterface || fakeType.IsSubclassOf(typeof(Delegate)))
{
return new[] { new ConstructorMethod(type.GetDefaultConstructor()) };
}
๊ทธ๋ฐ ๋ค์ Fake<Func<int, int>>
๋ง๋ค๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Func<int, int>
๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ, ๋๋ ๊ทธ๊ฒ์ ๋น ๋ฅด๊ฒ ํ๊ณ ์กฐ๋ช
๊ธฐ๊ฐ DelegateGenerator
๋ฅผ ์ฌ์ฉํ์ฌ (๋น FakeItEasy) ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์์ฑํ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
๋น์ ๊ณผ ๋ ์ฌ์ด์ AutoFixture ์ํคํ
์ฒ์ ๋น๋์ ๋ฆด๋ ์ด ๋ฑ์ ๊ด๊ณ๊ฐ ํญ์ ํผ๋์ค๋ฌ์ ์ง๋ง ๊ณ์ํด์ ํ์ํ๊ณ ๊ฒฉ์ฐจ๊ฐ ์ด๋ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
๋ด๊ฐ ๋์์์ด. ์ดํดํ ์ ์์ต๋๋ค. FakeItEasyRelay๋ ์กฐ๋ช
๊ธฐ์ ์๋ฅ๋ฌผ ์์ง๊ธฐ์ ์ถ๊ฐ๋์ง๋ง DelegateGenerator
๋ ๋จผ์ ๋๋ฆฌ์๋ฅผ ์์ฑํฉ๋๋ค.
๋น ๋ฅธ ๊ฒ์์์๋ ์ฒด์ธ์ ์ด๊ธฐ์ FakeItEasy ๋น๋๋ฅผ ์ฝ์
ํ๋ ๋ฐฉ๋ฒ์ ๋ํ๋ด์ง ์์์ง๋ง ์ ๋๋ก ๋ณด์ด์ง ์์ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ์ด๋ป๊ฒ ์งํ๋๋์ง์ ๊ด๊ณ์์ด TDelegate
๊ฐ ๋๋ฆฌ์ ์ ํ์ธ Fake<TDelegate>
์กฐ๋กฑ์ ํ์ฉํ๋ PR์ ์ ์ถํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค.
@blairconrad FakeItEasy ์ฌ์ฉ์๋ก์ ๋๋ ๋น์ ์ PR์ ๊ฐ๋งํฉ๋๋ค :)
@blairconrad ์ค๋ช ๊ณผ ์กฐ์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ๋ฐฉ๊ธ ํ ๋ฒ ๋ ํ์ธํ๊ณ FakeItEasy๊ฐ ์ค์ ๋ก ๋๋ฆฌ์ธ์ ์ํ ๊ฐ์ง๋ฅผ ์์ฑํ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์๋ง๋ ์ด์ ํ ์คํธ์์ ๋ญ๊ฐ๋ฅผ ๋์ณค์ ๊ฒ์ ๋๋ค ๐
Func ์์ฑ์ ๊ดํด์
, ๋๋ ๊ทธ๊ฒ์ ๋นจ๋ฆฌ ๋ณด์๊ณ ๊ณ ์ ์ฅ์น๊ฐ DelegateGenerator๋ฅผ ์ฌ์ฉํ์ฌ (๋น FakeItEasy) ๋๋ฆฌ์๋ฅผ ๋ง๋๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
๋ค. Moq์ ๋๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. AutoFixture๋ ResidueCollectors
๊ฐ ์ฐจ์ํ ๊ธฐํ๊ฐ ์๊ธฐ ์ ์ ์ด๋ฌํ ์์ฒญ์ ๊ฐ๋ก์ฑ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
Fake<Delegate>
์์ฒญ์ ์ง์ํ๋๋ก ๋ฉ์๋ ์ฟผ๋ฆฌ๋ฅผ ํ์ฅํฉ๋๋ค.Customizations
์ปฌ๋ ์
์ ๋ฆด๋ ์ด๋ฅผ ์ถ๊ฐํ๋ ์ ์ฌ์ฉ์ ์ง์ ์ ์ถ๊ฐํ์ฌ ๋๋ฆฌ์ธ ์์ฒญ์ด AutoFixture ์ปค๋์์ ์ฒ๋ฆฌ๋๊ธฐ _์ ์_ ์ฒ๋ฆฌ(๋ฆด๋ ์ด)๋๋๋ก ํฉ๋๋ค. ์ฆ, ํด๋น ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ง ์์ง๋ง ์ฌ์ฉ์๋ ๋ฏธ๋ฆฌ ์ ์๋ ์ฌ์ฉ์ ์ง์ ์ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ํ์ฑํํ ์ ์์ต๋๋ค.@blairconrad ๋ํ
@zvirja๋, ๊ฐ์ฌํฉ๋๋ค.
๋ด ์๊ฐ ์ ๋น์ ์ด ๋ง๋ค. ๊ฐ์ง ๋๋ฆฌ์์ ์ด์ ์ ๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌ์ฑ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
Fake<Delegate>
๋ฅผ ์ง์ํ๋๋ก ๋ฉ์๋ ์ฟผ๋ฆฌ๋ฅผ ํ์ฅํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ๋ง์ํ์ ๋๋ก ์ถ๊ฐ ์ฌ์ฉ์ ์ง์ ์ ์ถ๊ฐํ ์์ ์
๋๋ค. ํ์ง๋ง Delegate
๊ฒ์ด ์ถฉ๋ถํ ์ข์์ง ๊ถ๊ธํฉ๋๋ค. ๋ค์์ ๋ณด๊ณ ๋ ๋ฒ๊ทธ ํฌ๋ง IEnumerable
๋๋ Task
๋๋ IDictionary
๊ฐ FakeItEasy์ ์ํด ์์กฐ๋๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?
์ค, @zvirja ๊ฐ ๋๋ฆฌ์ธ์ ์์กฐํ๋ ๊ตฌ๋ฌธ์ ๋ํ ํ์ธ์ ์์ฒญํ์ต๋๋ค. ์ด์ FakeItEasy/FakeItEasy#1321์ ์ฌ์ฉํ์ฌ FakeItEasy์ ๋ฌธ์์ ๋ณํฉ๋์์ง๋ง ๋ช ์์ ์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
```c#
var fakeDelegate = A.Fake
is the preferred syntax for clients, although "unnatural fakes" can be used:
```c#
var fakeDelegate = new Fake<Func<int, int>>();
ํ์๋ FakeItEasyBuilder
ํด๋์ค๊ฐ Fake๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์
๋๋ค.
์ฌ๋ฏธ์๋ ์ฌ์ค: ์์กฐ ๋๋ฆฌ์๋ ๋ฒ์ 1.7.4257.42๊น์ง ์ง์๋์ง ์์์ต๋๋ค(์๋ง๋ FakeItEasy/FakeItEasy@edb4f61d0db0a84b68c7a9395f2661a58579d34a ์ปค๋ฐ). ๊ฐ์ธ์ ์ผ๋ก "์ต์ํ ํด๋น ๋ฒ์ ์ FakeItEasy๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ด๊ฒ์ ์ป์ ์ ์์ต๋๋ค"๋ผ๊ณ ๋งํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. @zvirja ๋๋ ๋ค๋ฅธ ์ฌ๋๋ค, ์ด๊ฒ์ด ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์ญ๋๊น? ๊ธฐ์กด AutoFakeItEasyUnitTest ํ
์คํธ๋ฅผ ์ค๋จํ์ง ์๋๋ก ๋จ์ ํ
์คํธ๋ก ์ฝ๊ฐ์ ํธ๋ฆญ์ ์ํํด์ผ ํฉ๋๋ค.
์ด ์์ ์ฌํญ์ ๋ํ ์ต์ FakeItEasy ๋ฒ์ ์ ์
๋ฐ์ดํธํ์ง ์์ผ๋ ค๋ฉด. ๋๋ ์๋ง๋ ๋๋ฆฌ์ธ์ ์์ฒญํ๋ ๊ฒ์ด ์ด์จ๋ ๊ทธ ๋ฒ์ ์์ ์คํจํ์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์๋ง๋ ๊ทธ๋ ์ง ์์ ๊ฒ์
๋๋ค.
@blairconrad ์์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
@zvirja ๋๋ ๋ค๋ฅธ ์ฌ๋๋ค, ์ด๊ฒ์ด ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์ญ๋๊น?
์๋ ์ ํ. ์ฌ๊ธฐ์์ ํ๋ก์ฐํ๋ SemVer์ ๋ฐ๋ฅด๋ฉด ๋์ผํ ์ฃผ ๋ฒ์ ๋ด์์ ์ข ์์ฑ ๋ฒ์ ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ๊ธฐ๋ฅ์ ์ง์ํ๋ FakeItEasy ๋ฒ์ ์ ๋ํ ์ง์์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ๋จ๊ณ๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ๋์ค์ (์ผ๊ด์ฑ์ ์ํด) v5์์ 1.x ์ง์์ ์ค๋จํ ์ ์์ง๋ง ์ด๋ ํฅํ์๋ง ๋ฐ์ํ ๊ฒ์ ๋๋ค.
๊ณ์ ์งํํ๊ธฐ๋ก ๋์ํ ๋๋ก(FakeItEasy๋ ๋๋ฆฌ์ธ์ ์ง์ํจ) ์ด ๋ฌธ์ ๋ฅผ ๊ธฐ๋ฅ์ผ๋ก ๋ณํํฉ๋๋ค.
v4.2.0 ์ถ์! ์ฌ์ฉํ๋ ค๋ฉด:
c#
fixture.Customize(new AutoFakeItEasyCustomization { GenerateDelegates = true });
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
v4.2.0 ์ถ์! ์ฌ์ฉํ๋ ค๋ฉด:
c# fixture.Customize(new AutoFakeItEasyCustomization { GenerateDelegates = true });