Autofixture: FakeItEasy . рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдирдХрд▓реА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 16 рдлрд╝рд░ре░ 2018  ┬╖  15рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: AutoFixture/AutoFixture

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдСрдЯреЛрдлрд┐рдХреНрдЪрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирдХрд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рднреА рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред

enhancement good first issue

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

v4.2.0 рдореЗрдВ рдЬрд╛рд░реА! рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
c# fixture.Customize(new AutoFakeItEasyCustomization { GenerateDelegates = true });

рд╕рднреА 15 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕ рдирдХрд▓реА рдврд╛рдВрдЪреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ? рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдПрдХреАрдХрд░рдг рд╣реИрдВ (Moq, NSubsitute, FakeItEasy), рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Moq рдПрдХреАрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ (рдХрдо рд╕реЗ рдХрдо рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ # 742 рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред

рд╕рд╛рде рд╣реА рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ AutoFixture рдХрд╛ рдЕрдкрдирд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкреАрдврд╝реА рддрдВрддреНрд░ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ?

@zvirja рдореИрдВ
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЕрдиреБрдХреВрд▓рди рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рдирдХрд▓реА рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
var myFake= fixture.Create<ISomeInterface>();

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
var myFake= fixture.Create<Func<int,int>>();

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рд╕рд┐рд░реНрдл рдПрдХ рдирдХрд▓реА рдбрдореА рдкреНрд░рддрд┐рдирд┐рдзрд┐ рджреЗрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:

var myFake= fixture.Create<Fake<Func<int,int>>>();

AutoFixture.ObjectCreationExceptionWithPath
рдПрдЪрдкрд░рд┐рдгрд╛рдо = 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 рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирдХрд▓реА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ:
image

@blairconrad рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдХреБрдЫ рдорд┐рдирдЯ

рдзрдиреНрдпрд╡рд╛рдж: рдкрд▓рдХ:

@zvirja , рдЦреБрд╢ред рдЬреИрд╕рд╛ рдХрд┐ @OnurGumus рдХрд╣рддреЗ рд╣реИрдВ, FakeItEasy рдЦреБрд╢реА рд╕реЗ рдирдХрд▓реА рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реЛрдВрдЧреЗ (рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореБрджреНрджрд╛ рдмрдирд╛рдпрд╛ рд╣реИ)ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, AutoFakeItEasy рдиреЗ рдирдХрд▓реА рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рд╕реЗ рдХрднреА рднреА рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред

рдЬрдм faking рдПрдХ Fake<Func<int, int>> , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, FakeItEasyMethodQuery.SelectMethods рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ Fake<T> рдЬрд╣рд╛рдВ T рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реИред рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдмрд╣реБрдд рд╣реА рднреЛрд▓рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЗрд╕реЗ рд╕реБрдзрд╛рд░рддрд╛ рд╣реИред

@@ -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) рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛ред
рдЖрдкрдХреЗ рдФрд░ рдореЗрд░реЗ рдмреАрдЪ, рдореИрдВ рд╣рдореЗрд╢рд╛ рдСрдЯреЛрдлрд┐рдХреНрдЪрд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдФрд░ рдПрдХ рдмрд┐рд▓реНрдбрд░ рдФрд░ рдПрдХ рд░рд┐рд▓реЗ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВ рдХреЗ рдмреАрдЪ рдХреЗ рд╕рдВрдмрдВрдз рд╕реЗ рднреНрд░рдорд┐рдд рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдФрд░ рджреЗрдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдВрддрд░ рдХрд╣рд╛рдВ рд╣реИред

рдореИрдВ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реВрдВред рдореИрдВ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдБред FakeItEasyRelay рдХреЛ рдлрд┐рдХреНрд╕реНрдЪрд░ рдХреЗ рдЕрд╡рд╢реЗрд╖ рд╕рдВрдЧреНрд░рд╛рд╣рдХреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди DelegateGenerator рдкрд╣рд▓реЗ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдмрдирд╛рддрд╛ рд╣реИред
рдПрдХ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓рд╛ рдХрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдкрд╣рд▓реЗ FakeItEasy рдмрд┐рд▓реНрдбрд░ рдХреЛ рдХреИрд╕реЗ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд╣реА рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реВрдВред

рднрд▓реЗ рд╣реА рдпрд╣ рдХреИрд╕реЗ рднреА рд╣реЛ, рдореБрдЭреЗ Fake<TDelegate> рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рд╕рдмрдорд┐рдЯ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА рдЬрд╣рд╛рдВ TDelegate рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкреНрд░рдХрд╛рд░ рд╣реИред

@blairconrad рдПрдХ FakeItEasy рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рдЖрдкрдХреЗ рдкреАрдЖрд░ рдХреЗ рд▓рд┐рдП рддрд░рд╕рддрд╛ рд╣реВрдВ :)

@blairconrad рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдФрд░ рдЖрдкрдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВрдиреЗ рдЕрднреА рдПрдХ рдмрд╛рд░ рдФрд░ рдЬрд╛рдБрдЪ рдХреА рд╣реИ рдФрд░ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ FakeItEasy рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирдХрд▓реА рдмрдирд╛рддрд╛ рд╣реИред рд╢рд╛рдпрдж, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкрд┐рдЫрд▓реЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХреБрдЫ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реИ

Func . рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЬрд▓реНрджреА рд╕реЗ рджрд┐рдпрд╛ рдФрд░ рдкрд╛рдпрд╛ рдХрд┐ рд╕реНрдерд┐рд░рддрд╛ рдПрдХ (рдЧреИрд░-FakeItEasy) рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП DelegateGenerator рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред

рд╣рд╛рдВред Moq рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ - AutoFixture рдЙрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ ResidueCollectors рдореЗрдВ рдЭрдВрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реЛред

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛:

  • Fake<Delegate> рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреНрд╡реЗрд░реА рдмрдврд╝рд╛рдПрдБ;
  • рдПрдХ рдирдпрд╛ рдЕрдиреБрдХреВрд▓рди рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ Customizations рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд░рд┐рд▓реЗ рдЬреЛрдбрд╝ рджреЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЕрдиреБрд░реЛрдз рдХреЛ рдСрдЯреЛрдлрд┐рдХреНрд╕реНрдЪрд░ рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (рд░рд┐рд▓реЗрдб) _before_ред рдорддрд▓рдм, рд╡рд╣ рд╕реБрд╡рд┐рдзрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд░рд┐рдп рдирд╣реАрдВ рд╣реЛрдЧреА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@blairconrad рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ AutoFixture рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдирдХрд▓реА рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХрд╛ рдХреНрдпрд╛ рд▓рд╛рдн рд╣реИ? рдЕрднреА рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдмрд╛рдд рдЖрддреА рд╣реИ - рдЖрдк рдирдХрд▓реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдзрдиреНрдпрд╡рд╛рдж, @zvirjaред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕рд╣реА рд╣реИрдВред рдирдХрд▓реА рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдирдХрд▓реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ Fake<Delegate> рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреНрд╡реЗрд░реА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдкреНрд░рд╕рдиреНрдирддрд╛ рд╣реЛ рд░рд╣реА рд╣реИ, рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдиреБрдХреВрд▓рди рдЬреЛрдбрд╝реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрд╢реНрдЪрд░реНрдп рд╣реИ: рдХреНрдпрд╛ Delegate рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ? рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЕрдЧрд▓реА рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЧрдИ рдмрдЧ рдХреА рдЗрдЪреНрдЫрд╛ IEnumerable рдпрд╛ Task рдпрд╛ IDictionary FakeItEasy рджреНрд╡рд╛рд░рд╛ рдирдХрд▓реА рд╣реЛ?

рдУрд╣, @zvirja рдиреЗ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ

```рд╕реА#
рд╡рд░ рдирдХрд▓реА рдкреНрд░рддрд┐рдирд┐рдзрд┐ = рдП рдирдХрд▓реА>();

is the preferred syntax for clients, although "unnatural fakes" can be used:

```c#
var fakeDelegate = new Fake<Func<int, int>>();

рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдпрд╣ рд╣реИ рдХрд┐ FakeItEasyBuilder рд╡рд░реНрдЧ рдирдХрд▓реА рдХреИрд╕реЗ рдмрдирд╛рдПрдЧрд╛ред

рдордЬреЗрджрд╛рд░ рддрдереНрдп: рдирдХрд▓реА рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕реНрдХрд░рдг 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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

zvirja picture zvirja  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gtbuchanan picture gtbuchanan  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

DeafLight picture DeafLight  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Ephasme picture Ephasme  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

malylemire1 picture malylemire1  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ