Autofixture: FakeItEasy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€๋ฆฌ์ž๋ฅผ ๊ฐ€์งœ๋กœ ์ทจ๊ธ‰

์— ๋งŒ๋“  2018๋…„ 02์›” 16์ผ  ยท  15์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: AutoFixture/AutoFixture

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ, AutoFixture๋Š” ์ž๋™์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ถ”์ƒ ์œ ํ˜•์„ mockable๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชฉ๋ก์— ๋Œ€๋ฆฌ์ž ์œ ํ˜•๋„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

enhancement good first issue

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

v4.2.0 ์ถœ์‹œ! ์‚ฌ์šฉํ•˜๋ ค๋ฉด:
c# fixture.Customize(new AutoFakeItEasyCustomization { GenerateDelegates = true });

๋ชจ๋“  15 ๋Œ“๊ธ€

๋จผ์ € ์–ด๋–ค ๋ชจ์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์ž‘์—…ํ•˜๋Š”์ง€ ๋ช…ํ™•ํžˆ ํ•ด์ฃผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ช‡ ๊ฐ€์ง€ ํ†ตํ•ฉ(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.Fake 1[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๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
image

@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 });

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰