рд╕реНрдЯрдмреНрд╕
рдЖрдЗрдП рдРрд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдореВрд▓реНрдп, рд╕рд╛рде рд╣реА рд╕рд╛рде рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдирд╡рд░реНрд╕рди, рдФрд░ рдЕрдиреНрдп рдкрд╛рдЧрд▓рдкрдирдкреВрд░реНрдг рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдФрд░ рдкреИрдЯрд░реНрди (рд╢рд╛рдпрдж рд╕рднреА рдЕрдиреНрдп рдареЛрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд, рдФрд░ рд╢рд╛рдпрдж рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ FIRST ) рдЬреИрд╕реЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВред рдФрд░ рдпрд╣ рднреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдкрд░реАрдХреНрд╖рдг рдпрд╛ рдЕрдВрдХрд▓ рдмреЙрдм рдХреЗ рдкреНрд░рд╢рдВрд╕рдХ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЙрдЪреНрдЪ рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдЦрд░рд╛рдм рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдХреЗ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдпрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдХреЗ рдирд┐рд░реНрднрд░рддрд╛ рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рддреЛ, рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ IFoo рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
namespace PlayingWithMoles
{
// , -
public interface IFoo
{
string SomeMethod();
}
// - , IFoo
public class FooConsumer
{
// ""
public FooConsumer(IFoo foo)
{
this .foo = foo;
}
// , - IFoo
public void DoStuff()
{
var someResults = foo.SomeMethod();
Console .WriteLine( "Doing stuff. IFoo.SomeMethod results: {0}" , someResults);
}
private readonly IFoo foo;
}
}
* This source code was highlighted with Source Code Highlighter .
рдЕрдм, рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдЙрдЬреНрдЬреНрд╡рд▓ рджрд┐рдорд╛рдЧреЛрдВ рдХреЛ рдХрдо рдЙрдЬреНрдЬреНрд╡рд▓ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рджреМрд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдХреНрдпрд╛ рд╕рдорд╛рди FooConsumer рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рд╣реИ, рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЕрджреНрднреБрдд DoStuff рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде (рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд▓рдЧрднрдЧ рд╢реВрдиреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╕рдордЭрд╛) ред рдЗрд╕рд▓рд┐рдП, FooConsumer рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ IFoo рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдвреВрдВрдврдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдХрд┐ рдпрд╣ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ (рдпрд╛ рдЕрд╕рдВрднрд╡) рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд░реНрдЧ рдирд┐рд░реНрднрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдФрд░ рд╡рд░реНрдЧ, рдЬреЛ рддреАрд╕рд░реЗ рдФрд░ рдЗрддрдиреЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рд╣рдорд╛рд░реЗ рднрд╛рдИ рдХреА рдРрд╕реА рдЪрд╛рд▓ рдирд╣реАрдВ рдЪрд▓ рд╕рдХрддреА рд╣реИ, рдФрд░ рдЕрдЧрд░ рд╣рдордиреЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛, рддреЛ рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╣рд╛рде рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХрд┐рд╕реА рднреА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдорд┐рд▓рддрд╛ рд╣реИ:
[TestClass()]
public class FooConsumerTest
{
class FooTester : IFoo
{
public string SomeMethod()
{
return "Test string" ;
}
}
[TestMethod]
public void DoStuffTest()
{
IFoo foo = new FooTester();
FooConsumer target = new FooConsumer(foo);
target.DoStuff();
}
}
* This source code was highlighted with Source Code Highlighter .
рдЕрдм рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд╡рд┐рдВрдбреЛ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: рд╕рд╛рдорд╛рди рдХрд░рдирд╛ред IFoo.SomeMethod рдкрд░рд┐рдгрд╛рдо: рд╣реИрд▓реЛ, рдХрд╕реНрдЯрдо рд╕реНрдЯрдм ред рд╣рд╛рдВ, рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдЖрдк рдФрд░ рдореИрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИрдВ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╣рдореЗрдВ рдЗрд╕рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдпрдж рд╣реА рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд╛рдо рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВред
рддреЛ, рдореЛрд▓реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реАред рдЗрд╕ рдЙрдкрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕реНрдЯрдмреНрд╕ рдмрдирд╛рдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИред рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдкрд░ рд░рд╛рдЗрдЯ-рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ "рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ рдореЛрд▓ рдЬреЛрдбрд╝реЗрдВ" рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ "MyAssemblyName.moles" рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрдиреЗрдХреНрдЯреЗрдб рдЕрд╕реЗрдВрдмрд▓реА рдХреА рд╕реВрдЪреА рдЕрд╕реЗрдВрдмрд▓реА MyAssemblyName.Moles рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧреА, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЙрддреНрдкрдиреНрди рд╕реНрдЯрдмреНрд╕ рд╣реЛрдВрдЧреЗред рдпрд╣ рдЙрдкрдХрд░рдг рддрдм рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╕рдлрд▓ рдмрд┐рд▓реНрдб рдмрд┐рд▓реНрдб рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЯреНрд░реИрдХ рдХрд░реЗрдЧрд╛ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдЯрдмреНрд╕ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред MyAssemblyName.moles рдлрд╝рд╛рдЗрд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рд╕рд░рд▓ xml рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдЬреЛ рдЕрд╕реЗрдВрдмрд▓реА рдХрд╛ рдирд╛рдо рд╕реЗрдЯ рдХрд░рддреА рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕реНрдЯрдмреНрд╕ рдЙрддреНрдкрдиреНрди рд╣реЛрдВрдЧреЗ, рд╕рд╛рде рд╣реА рдЙрдирдХреА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреИрд░рд╛рдореАрдЯрд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдЯрдмреНрд╕, рд╕реНрдЯрдмреНрд╕ рдпрд╛ рд╕реНрдЯрдмреНрд╕ рдХреЗ рдкреНрд░рдХрд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореЛрд▓реНрд╕) рдФрд░ рдЕрдзрд┐рдХ)ред
рдиреЛрдЯ
рд╕рдВрд╕реНрдХрд░рдг 0.94 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рдореЛрд▓реНрд╕ рдлрд╝рд╛рдЗрд▓ рдпреЛрдЬрдирд╛ рдмрджрд▓ рдЧрдИ рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк рд╕реНрдЯрдмреНрд╕ рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕рдВрдХрд▓рди рдХреЛ рд░рджреНрдж рдХрд░ рд╕рдХрддреЗ рдереЗ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рдХрд┐рд╕реА рдПрдХ рднрд╛рдЧ рдореЗрдВ рд╕рдВрдХрд▓рди = рдЧрд▓рдд рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рдереЗ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдпрд╣ рддрдереНрдп рд╕рд╛рдордиреЗ рдЖрдпрд╛ рдерд╛ рдХрд┐ рд╕реНрдЯрдмреНрд╕ рдХреЗ рд╕рд╛рде рдЕрд╕реЗрдВрдмрд▓реА рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реБрдИ рдереА, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЙрддреНрдкрдиреНрди рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╡рд░реНрддрдорд╛рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕реАрдзреЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред 0.94 рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдЧрд╛рдпрдм рд╣реЛ рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЕрднреА рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдмрдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЕрдлрд╡рд╛рд╣ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдЙрдкрдХрд░рдг рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдЙрддреНрдкрдиреНрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдирд┐рдореНрди рд╕реНрдерд╛рди рдкрд░ рд╕рд╣реЗрдЬрддрд╛ рд╣реИ: MyTestProject \ obj \ Debug \ Moles \ sl \ mgslред
рдЖрдЗрдП рдЗрд╕ рдЯреВрд▓ рджреНрд╡рд╛рд░рд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрдирд╛рдП рдЧрдП рдХреЛрдб рдХреЗ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рджреЗрдЦреЗрдВ:
namespace PlayingWithMoles.Moles
{
public class SIFoo
: Microsoft.Moles.Framework.Stubs.StubBase
, IFoo
{
string IFoo.SomeMethod()
{
var sh = this .SomeMethod;
if (sh != null )
return sh.Invoke();
else
{
// Behavior-,
}
}
// Sets the stub of IFoo.SomeMethod
public Func< string > SomeMethod;
}
}
* This source code was highlighted with Source Code Highlighter .
рддреЛ, рдЙрддреНрдкрдиреНрди рд╡рд░реНрдЧ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдореВрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддреЗ рд╣реИрдВред рдЪреВрдБрдХрд┐ рд╣рдорд╛рд░реА рдкрджреНрдзрддрд┐ рдХрд┐рд╕реА рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ , рд╕реНрдЯрдм рдореЗрдВ рдлрдВрдХ <string> (рдпрд╛рдиреА, рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рдХреЛрдИ рднреА рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ) рдХрд╛ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, SomeMethod рдкрджреНрдзрддрд┐ рдореЗрдВ, рдЗрд╕ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдмрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрджрд┐ рдпрд╣ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЕрд╢рдХреНрдд рд╣реИ , рддреЛ рдПрдХ StubNotImplementedException рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдбрд╛рд▓реА рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрдЯрдм рдХреНрд▓рд╛рд╕ рдХрд╛ рдирд╛рдо рд╣реИ: S InterfaceOrClassName, рдФрд░ рдпрд╣ рдУрд░рд┐рдЬрд┐рдирд▓ рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ рд╣реИ ред рдореЛрд▓реНрд╕ рдиреЗрдорд╕реНрдкреЗрд╕ ред
рдЕрдм рдЕрдкрдиреЗ рдореВрд▓ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рд╕реНрдЯрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
[TestMethod]
public void DoStuffTestWithStubs()
{
var fooStub = new PlayingWithMoles.Moles.SIFoo();
fooStub.SomeMethod = () => "Hello, Stub!" ;
var target = new FooConsumer(fooStub);
target.DoStuff();
}
* This source code was highlighted with Source Code Highlighter .
рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдкрд░, рд╣рдо, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ, рдирд┐рдореНрди рдкрдВрдХреНрддрд┐ рджреЗрдЦреЗрдВрдЧреЗ: рд╕рд╛рдорд╛рди рдХрд░рдирд╛ред IFoo.SomeMethod рдкрд░рд┐рдгрд╛рдо: рдирдорд╕реНрддреЗ, рдореЛрд▓реНрд╕ рд╕реНрдЯрдм!
рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╕реНрдЯрдмреНрд╕ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░-рд╕реАрд▓ рдФрд░ рдЧреИрд░-рд╕реАрд▓рдмрдВрдж рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╡рд░реНрдЪреБрдЕрд▓ (рд╕реАрд▓ рдирд╣реАрдВ) рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рдФрд░ рдХреЛрдИ рдЬрд╛рджреВ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╡рд╛рд░рд┐рд╕ рдХрдХреНрд╖рд╛рдПрдВ рдпрд╛ рдХрдХреНрд╖рд╛рдПрдВ рдЬреЛ рдЖрдкрдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИрдВ, рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рдХреЙрд▓ рд╢реЗрдбреНрдпреВрд▓рд┐рдВрдЧ рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдХреЙрд▓ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рдВ, рдпрд╣ рдмрд╛рдд рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдереЛрдбрд╝рд╛ рд╕рдордп рдмрдЪрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд ... рдореЛрд▓реНрд╕ред
рдореЛрд▓реНрд╕
рдореЛрд▓реНрд╕ рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдЯрдм рд╣реИрдВ, рдЬреЛ рд╕реНрдЯрдмреНрд╕ рдХреЗ рд╕рдорд╛рди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдЯреИрдЯрд┐рдХ рдпрд╛ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдФрд░ рдЧреИрд░-рд╡рд░реНрдЪреБрдЕрд▓ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ FooConsumer рд╡рд░реНрдЧ IFoo рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ Foo рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рддрд░реАрдХреЗ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВ:
namespace PlayingWithMoles
{
// Foo,
// , IFoo
public class Foo
{
public string SomeMethod()
{
return "Hello, from non-virtual method." ;
}
}
// - , Foo
public class FooConsumer
{
// Foo
public FooConsumer(Foo foo)
{
this .foo = foo;
}
// , - Foo
public void DoStuff()
{
var someResults = foo.SomeMethod();
Console .WriteLine( "Doing stuff. Foo.SomeMethod results: {0}" ,
someResults);
}
private readonly Foo foo;
}
}
* This source code was highlighted with Source Code Highlighter .
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рднрд░рдиреЗ рдФрд░ IFoo рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдпрд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЕрд╕рдВрднрд╡ рд╣реИред рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рд╕реА рдФрд░ рдХрд╛ рдХреЛрдб рдорд┐рд▓рддрд╛ рд╣реИ, рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рджрд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ рд╣рдореЗрдВ рдзреАрд░реЗ-рдзреАрд░реЗ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрдм рдкрд░реАрдХреНрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ; рдФрд░ рдпрд╣ рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ рдЬрдм рдпрд╣ рдХреЛрдб рдмрджрд▓рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ; рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдПрдХ рддреГрддреАрдп-рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдпрд╛ рдмрд╛рд╣рд░реА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдкрд░реАрдХреНрд╖рдг рдЖрдкрдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИред
рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд▓рдЧ рдЗрд╕ рдЙрдкрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдореЛрд▓реНрд╕ - рдорджрдж рдХрд░реЗрдВрдЧреЗред рдореЛрд▓реНрд╕ рдПрдХ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╣реА рдиреЗрд╕реНрдЯреЗрдб рдиреЗрдорд╕реНрдкреЗрд╕ (рдУрд░рд┐рдЬрд┐рдирд▓ рдиреЗрдорд╕реНрдкреЗрд╕ )ред рдореЛрд▓реНрд╕ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрдирдореЗрдВ рдЙрдкрд╕рд░реНрдЧ S рдХреЗ рдмрдЬрд╛рдп рдЙрдкрд╕рд░реНрдЧ M рд╣реЛрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд░реНрдЪреБрдЕрд▓ рддрд░реАрдХреЛрдВ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЧреИрд░-рд╡рд░реНрдЪреБрдЕрд▓ рд╕реНрдЯреЗрдЯрд┐рдХ рддрд░реАрдХреЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЛрд▓реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ CLR Profiler рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдХреЙрд▓рдмреИрдХ ICorProfilerCallback :: JITCompilationStarted рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ , рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░рд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдореВрд▓ рд╡рд┐рдзрд┐ рдХреЗ рдмрдЬрд╛рдп "рдзрдХреНрдХрд╛" рджреЗрддрд╛ рд╣реИред рдирддреАрдЬрддрди, рдореВрд▓ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреНрд▓рд╛рд╕ рдкреНрд▓реЗрд╡рд┐рдердореЙрд▓реНрд╕ рдЙрддреНрдкрдиреНрди рд╣реЛрдВрдЧреЗред Moles.M рдлреВ, рдФрд░ рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк FooConsumer рд╡рд░реНрдЧ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ (рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА) DoStuff рд╡рд┐рдзрд┐ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
[TestMethod]
[HostType( "Moles" )]
public void DoStuffTestWithMoles()
{
var fooMole = new PlayingWithMoles.Moles.MFoo();
fooMole.SomeMethod = () => "Hello, Mole!" ;
var target = new FooConsumer(fooMole);
target.DoStuff();
}
* This source code was highlighted with Source Code Highlighter .
[HostType ("Moles")] рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдореЛрд▓реНрд╕ рдХрд╛ рд╕рд╛рд░рд╛ рдЬрд╛рджреВ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡реЗ рдХреЛрдб рдФрд░ CLR рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреЗ "рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реНрдЯрдмреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд▓реЙрдиреНрдЪ рд╣реЛрдиреЗ рдкрд░ рд╣рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ: рд╕рд╛рдорд╛рдиред IFoo.SomeMethod рдкрд░рд┐рдгрд╛рдо: рдирдорд╕реНрддреЗ, рддрд┐рд▓!
рдЕрдм рдЖрдЗрдП рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рдкрд┐рдЫрд▓реА рдХрдИ рдкреЛрд╕реНрдЯреЛрдВ рдореЗрдВ, рдореИрдВрдиреЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рдВрд╕ рдХреЗ рдЖрд╕-рдкрд╛рд╕ рдЯреИрдореНрдмреЙрд░реАрди рдХреЗ рд╕рд╛рде рдбрд╛рдВрд╕ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЛ рджреЗрдЦрд╛ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рд╡реЗрдм рдкреЗрдЬ рдХрдВрдЯреЗрдВрдЯ рдХреЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░рд┐рдЯреНрд░реАрд╡рд▓ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рдореБрдЭреЗ рдХрднреА-рдХрднреА рдЗрдВрдЯрд░рдиреЗрдЯ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рдмрд┐рдирд╛ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдореИрдВ рд╣рд░ рдмрд╛рд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЗрд╕ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдЙрддреНрдкрдиреНрди рд╣реБрдЖред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдирд┐рдпрдо рдмрд╛рд╣рд░реА рд╕рдВрд╕рд╛рдзрдиреЛрдВ (рдЬреИрд╕реЗ рдлрд╛рдЗрд▓реЗрдВ, рдиреЗрдЯрд╡рд░реНрдХ рдХрдиреЗрдХреНрд╢рди, рдбреЗрдЯрд╛рдмреЗрд╕) рд╕реЗ рдЗрд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдпрдерд╛ рдпреЗ рдкрд░реАрдХреНрд╖рдг рдЕрдм рдореЙрдбреНрдпреВрд▓рд░ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдПрдХреАрдХрд░рдг рд╣реЛрдВрдЧреЗред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдЦрд░рд╛рдм рд╣реИрдВ, рдирд╣реАрдВ, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рдХреЛрдб рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЗрди рдмрд╛рд╣рд░реА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЪрд╛рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ WebRequestor рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдПрдХ рд╡реЗрдм рдкреЗрдЬ рдПрдХреНрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рд▓рдВрдмрд╛рдИ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ:
public class WebRequester
{
public void RequestWebPage( string url)
{
var request = WebRequest.Create(url);
var response = request.GetResponse();
Console .WriteLine( "Sync version. URL: {0}, Response content length: {1}" ,
url, response.ContentLength);
}
}
* This source code was highlighted with Source Code Highlighter .
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рд╣рдореЗрдВ WebRequest рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдореЛрд▓реНрд╕ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдЕрд╕реЗрдВрдмрд▓реА рдкрд░ рд░рд╛рдЗрдЯ-рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд░реНрдЧ рдЗрд╕рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ), "Moles рдЕрд╕реЗрдВрдмрд▓реА рдЬреЛрдбрд╝реЗрдВ" рдореЗрдиреВ рдЖрдЗрдЯрдо рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдлрд┐рд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк System.Behaviors.dll рдЕрд╕реЗрдВрдмрд▓реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ , рдореВрд▓ System.dll рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕реНрдЯрдмреНрд╕ рдФрд░ рдореЙрд▓ рдХреЗ рд╕рд╛рдеред
рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
[TestMethod]
[HostType( "Moles" )]
public void RequestWebPageTest()
{
var mole = new System.Net.Moles.MHttpWebResponse();
mole.ContentLengthGet = () => 5;
// URL-.
// , :
//System.Net.Moles.MHttpWebRequest.AllInstances.GetResponse = (r) =>
// {
// if (r.RequestUri == new Uri("http://rsdn.ru"))
// return mole;
// return r.GetResponse();
// };
//
System.Net.Moles.MHttpWebRequest.AllInstances.GetResponse = (r) => mole;
WebRequester target = new WebRequester();
target.RequestWebPage( "http://rsdn.ru" );
}
* This source code was highlighted with Source Code Highlighter .
рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ, рд╣рдо рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ HttpWebResponse рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯрдм рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ System.Net рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред M HttpWebRespoonse рдирд╛рдо рдХреЗ рд╕рд╛рде рдХреБрдЫ рдиреЗрдорд╕реНрдкреЗрд╕ , рдФрд░ ContentLength рд╕рдВрдкрддреНрддрд┐ рдХреЗ "рдмреЙрдбреА" рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рд▓реИрдореНрдмреНрдбрд╛ рдХреЛ рд╣рдереЗрд▓реА рдкрд░ рд░рдЦрддреЗ рд╣реИрдВ рдЬреЛ 5 рд░рд┐рдЯрд░реНрди рдХрд░рддрд╛ рд╣реИред рдЕрдм рд╣рдо GetResponse рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд░рдХреЗ HttpWebRequest рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП GetResponse рд╡рд┐рдзрд┐ рдХреЛ "рд╕рдВрд╢реЛрдзрд┐рдд" рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ WebRequester рд╡рд░реНрдЧ рдХреЗ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯрдкреЗрдЬ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрдВрдЯрд░рдиреЗрдЯ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рдмрд┐рдирд╛: рд╕рд┐рдВрдХ рд╕рдВрд╕реНрдХрд░рдгред URL: rsdn.ru , рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рд╛рдордЧреНрд░реА рдХреА рд▓рдВрдмрд╛рдИ: 5ред
рдЕрдм рд╡реЗрдм рдкреЗрдЬ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ, WebRequester рд╡рд░реНрдЧ рдХрд╛ RequestWebPageAsync рд╡рд┐рдзрд┐:
public void RequestWebPageAsync( string url)
{
var waiter = new ManualResetEvent( false );
var request = WebRequest.Create(url);
request.BeginGetResponse(
ar=>
{
var response = request.EndGetResponse(ar);
Console .WriteLine( "Async version. URL: {0}, Response content length: {1}" ,
url, response.ContentLength);
waiter.Set();
}, null );
waiter.WaitOne();
}
* This source code was highlighted with Source Code Highlighter .
рдкрд░реАрдХреНрд╖рдг рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рдпрдВрддреНрд░рдг рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ред рдЗрд╕ рдХреЛрдб рдореЗрдВ, рд╣рдо AsyncResult.AsyncWaitHandle рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ BeginGetResponse рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛, рдХреНрдпреЛрдВрдХрд┐ RequestWebPageAsync рд╡рд┐рдзрд┐ рдЕрдиреБрд░реЛрдз рддрдХ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреА рд╣реИред рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдРрд╕реЗ "рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ" рд╕реЗ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдВ рдореИрдВ рдХреЗрд╡рд▓ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдЪрд╛рд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рддреЛ, рдЕрдм рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐:
[TestMethod]
[HostType( "Moles" )]
public void RequestWebPageAsyncTest()
{
var mole = new System.Net.Moles.MHttpWebResponse();
mole.ContentLengthGet = () => 5;
// ,
//
Action action = () => Thread.Sleep(500);
// , ,
//
// - (-,
// ).
ThreadPool.SetMinThreads(3, 3);
System.Net.Moles.MHttpWebRequest.AllInstances.BeginGetResponseAsyncCallbackObject =
(r, a, iar) => action.BeginInvoke(a, iar);
System.Net.Moles.MHttpWebRequest.AllInstances.EndGetResponseIAsyncResult =
(r, iar) => { action.EndInvoke(iar); return mole; };
WebRequester target = new WebRequester();
target.RequestWebPageAsync(http: //rsdn.ru);
}
* This source code was highlighted with Source Code Highlighter .
рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рдлрд┐рд░ рд╕реЗ M HttpWebResponse рд╕реНрдЯрдм рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг ContentLength рд╕рдВрдкрддреНрддрд┐ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░ 5 рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдПрдХ рд▓рдВрдмреЗ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдб рд╕реЗрд▓реЗрдк (500) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЪрд▓рд╛рдиреЗ рдкрд░, рд╣рдореЗрдВ рдпрд╣ рдорд┐рд▓рддрд╛ рд╣реИ: Async рд╕рдВрд╕реНрдХрд░рдгред URL: rsdn.ru , рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рд▓рдВрдмрд╛рдИ рд╕рд╛рдордЧреНрд░реА: 5. рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛!
рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп
рдореЛрд▓реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдПрдХ рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╕реНрдЯрдмреНрд╕ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛, рдФрд░ рдЖрдкрдХреЛ рдмрд╛рд╣рд░реА рд╕рдВрд╕рд╛рдзрдиреЛрдВ, рд╕реНрдерд┐рд░ рдпрд╛ рдЧреИрд░-рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ рд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдЕрдирдЯрд╛рдЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕реНрдЯрдмреНрд╕ рдмрдирд╛рдирд╛ рдПрдХ рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдмрд╕ рдЕрд╕рдВрднрд╡ рд╣реИред рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рдЗрд╕ рдЯреВрд▓ рдХреА рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдирд╛ рд▓рд╛рдЧреВ (рдпрд╛ рдирд╣реАрдВ) рд╣реИред
рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реНрдЯрдл рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред