Moq рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг

Moq рдПрдХ рд╕рд░рд▓ рдФрд░ рд╣рд▓реНрдХрд╛ рдЕрд▓рдЧрд╛рд╡ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИ рдЬреЛ рдЧреБрдордирд╛рдо рддрд░реАрдХреЛрдВ рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреЗрдбрд╝реЛрдВ рдкрд░ рдмрдирд╛рддрд╛ рд╣реИред рд╡рд╣ рдореВрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкреАрдврд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд╣ "рдЧреАрд▓реЗ" рдЗрдВрдЯрд░рдлреЗрд╕, рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ (рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдВрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЛрдВ) рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ "рдЧреАрд▓реЗ" рдЧреИрд░-рдЖрднрд╛рд╕реА рдФрд░ рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

рдиреЛрдЯ
рдмрд╛рдЬрд╛рд░ рдкрд░ рдХреЗрд╡рд▓ рджреЛ рдврд╛рдВрдЪреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдХреБрдЫ рднреА "рдЧреАрд▓рд╛" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдпреЗ TypeMockIsolator рдФрд░ Microsoft Fakes, Visual Studio 2012 рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ (рдЬрд┐рдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ Microsoft Moles рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛)ред Moq рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпреЗ рдЪреМрдЦрдЯреЗ, рдХреЛрдб рдкреАрдврд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди CLR рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдПрдкреАрдЖрдИ, рдЬреЛ рдЖрдкрдХреЛ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдЧрдиреЗ рдФрд░ рд╕реНрдереИрддрд┐рдХ, рдЧреИрд░-рдЖрднрд╛рд╕реА рдпрд╛ рдирд┐рдЬреА рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдореЛрдХреА / рд╕реНрдЯрдмреНрд╕ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

Moq рдореЗрдВ, "рд╕реНрдЯрдмреНрд╕" рдФрд░ "рдореЛрдХреНрд╕" рдХреЗ рдмреАрдЪ рдХреЛрдИ рдЕрд▓рдЧрд╛рд╡ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдЕрдзрд┐рдХ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рд░рд╛рдЬреНрдп рд╕рддреНрдпрд╛рдкрди рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рддреНрдпрд╛рдкрди рдХреЗ рдмреАрдЪ рдХреЛрдИ рдЕрд▓рдЧрд╛рд╡ рдирд╣реАрдВ рд╣реИред рдФрд░ рдпрджреНрдпрдкрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реНрдЯрдмреНрд╕ рдФрд░ рдореЛрдХ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА рдПрдХ рд╣реА рд╕реНрдЯрдм рджреЛрдиреЛрдВ рднреВрдорд┐рдХрд╛рдУрдВ рдХреЛ рдирд┐рднрд╛рддреЗ рд╣реИрдВ, рд╣рдо рд╕рд░рд▓ рд╕реЗ рдЬрдЯрд┐рд▓ рддрдХ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рд╣рдо рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рд╣рдо рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдПрдВрдЧреЗред ред

рд░рд╛рдЬреНрдп рдХрд╛ рд╕рддреНрдпрд╛рдкрди


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ:

public interface ILoggerDependency { string GetCurrentDirectory(); string GetDirectoryByLoggerName(string loggerName); string DefaultLogger { get; } } 


1. GetCurrentDirectory рд╡рд┐рдзрд┐ рдХрд╛ рджрд╛рдпрд░рд╛:

 // Mock.Of    (-),   -. //   ,    GetCurrentDirectory() //   "D:\\Temp" ILoggerDependency loggerDependency = Mock.Of<ILoggerDependency>(d => d.GetCurrentDirectory() == "D:\\Temp"); var currentDirectory = loggerDependency.GetCurrentDirectory(); Assert.That(currentDirectory, Is.EqualTo("D:\\Temp")); 


2. GetDirectoryByLoggerName рд╢реАрд░реНрд╖рдХ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐, рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рддреА рд╣реИ :

 //     GetDirectoryByLoggerName  "C:\\Foo". ILoggerDependency loggerDependency = Mock.Of<ILoggerDependency>( ld => ld.GetDirectoryByLoggerName(It.IsAny<string>()) == "C:\\Foo"); string directory = loggerDependency.GetDirectoryByLoggerName("anything"); Assert.That(directory, Is.EqualTo("C:\\Foo")); 


3. GetDirrectoryByLoggerName рд╡рд┐рдзрд┐ рдХрд╛ рджрд╛рдпрд░рд╛ , рдЬреЛ рддрд░реНрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рддрд╛ рд╣реИ:

 //    ,    //  GetDirrectoryByLoggerName    . //    : // public string GetDirectoryByLoggername(string s) { return "C:\\" + s; } Mock<ILoggerDependency> stub = new Mock<ILoggerDependency>(); stub.Setup(ld => ld.GetDirectoryByLoggerName(It.IsAny<string>())) .Returns<string>(name => "C:\\" + name); string loggerName = "SomeLogger"; ILoggerDependency logger = stub.Object; string directory = logger.GetDirectoryByLoggerName(loggerName); Assert.That(directory, Is.EqualTo("C:\\" + loggerName)); 


4. DefaultLogger рд╕рдВрдкрддреНрддрд┐ рд╢реАрд░реНрд╖рдХ :

 //  DefaultLogger       ILoggerDependency logger = Mock.Of<ILoggerDependency>( d => d.DefaultLogger == "DefaultLogger"); string defaultLogger = logger.DefaultLogger; Assert.That(defaultLogger, Is.EqualTo("DefaultLogger")); 


5. "moq рдлрдВрдХреНрд╢рдирд▓ рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди" (Moq v4 рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдХрдИ рддрд░реАрдХреЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕реЗрдЯ рдХрд░рдирд╛ред

 //        ┬л┬╗ ILoggerDependency logger = Mock.Of<ILoggerDependency>( d => d.GetCurrentDirectory() == "D:\\Temp" && d.DefaultLogger == "DefaultLogger" && d.GetDirectoryByLoggerName(It.IsAny<string>()) == "C:\\Temp"); Assert.That(logger.GetCurrentDirectory(), Is.EqualTo("D:\\Temp")); Assert.That(logger.DefaultLogger, Is.EqualTo("DefaultLogger")); Assert.That(logger.GetDirectoryByLoggerName("CustomLogger"), Is.EqualTo("C:\\Temp")); 


6. рд╕реЗрдЯрдЕрдк рд╡рд┐рдзрд┐рдпреЛрдВ ("рдкреБрд░рд╛рдиреЗ" v3 рд╕рд┐рдВрдЯреИрдХреНрд╕) рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдХрдИ рддрд░реАрдХреЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛:

 var stub = new Mock<ILoggerDependency>(); stub.Setup(ld => ld.GetCurrentDirectory()).Returns("D:\\Temp"); stub.Setup(ld => ld.GetDirectoryByLoggerName(It.IsAny<string>())).Returns("C:\\Temp"); stub.SetupGet(ld => ld.DefaultLogger).Returns("DefaultLogger"); ILoggerDependency logger = stub.Object; Assert.That(logger.GetCurrentDirectory(), Is.EqualTo("D:\\Temp")); Assert.That(logger.DefaultLogger, Is.EqualTo("DefaultLogger")); Assert.That(logger.GetDirectoryByLoggerName("CustomLogger"), Is.EqualTo("C:\\Temp")); 


рдиреЛрдЯ
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдореЛ рдореЗрдВ рдореЛрдХрд╛рд╕ рдФрд░ рд╕реНрдЯрдмреНрд╕ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдЕрд▓рдЧрд╛рд╡ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рджреЛ рд╕реНрдЯрдм рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рддреЛ, "moq рдлрдВрдХреНрд╢рдирд▓ рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди" рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рд░рд╛рдЬреНрдп (рдпрд╛рдиреА, рд╕реНрдЯрдмреНрд╕ рдХреЗ рд▓рд┐рдП) рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реЗрдЯрдЕрдк рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕реНрдЯрдмреНрд╕ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЙрдкрдпреЛрдЧ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рд╡реНрдпрд╡рд╣рд╛рд░ рдпрд╛ рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред

рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╕рддреНрдпрд╛рдкрди


рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╡рд░реНрдЧ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 public interface ILogWriter { string GetLogger(); void SetLogger(string logger); void Write(string message); } public class Logger { private readonly ILogWriter _logWriter; public Logger(ILogWriter logWriter) { _logWriter = logWriter; } public void WriteLine(string message) { _logWriter.Write(message); } } 


1. ILogWriter рдХреЗ рдХреЙрд▓ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ред рд▓реЙрдЧрд░ рд╡рд░реНрдЧ рдХреА рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рдеред рд╡рд┐рдзрд┐ (рдХрд┐рд╕реА рднреА рддрд░реНрдХ рдХреЗ рд╕рд╛рде):

 var mock = new Mock<ILogWriter>(); var logger = new Logger(mock.Object); logger.WriteLine("Hello, logger!"); // ,    Write      mock.Verify(lw => lw.Write(It.IsAny<string>())); 


2. ILogWriter рдХреЗ рдХреЙрд▓ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ред рджрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рдзрд┐:

 mock.Verify(lw => lw.Write("Hello, logger!")); 


3. рд╕рддреНрдпрд╛рдкрди рд╣реИ рдХрд┐ ILogWriter .Write рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдФрд░ рдирд╣реАрдВ, рдХрдо рдирд╣реАрдВ):

 mock.Verify(lw => lw.Write(It.IsAny<string>()), Times.Once()); 


рдиреЛрдЯ
рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдХрд┐ рдирд┐рд░реНрднрд░рддрд╛ рдХрд┐рддрдиреА рдмрд╛рд░ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдореНрд╕ рдХреНрд▓рд╛рд╕ рдХреА рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ: AtLeast (int), AtMost (int), рдмрд┐рд▓реНрдХреБрд▓, рдмреАрдЪ, рдФрд░ рдЕрдиреНрдпред

4. рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╕рддреНрдпрд╛рдкрди (рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдХреБрдЫ рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ):

 var mock = new Mock<ILogWriter>(); mock.Setup(lw => lw.Write(It.IsAny<string>())); var logger = new Logger(mock.Object); logger.WriteLine("Hello, logger!"); //     Verify   . //  ,      //   mock.Setup mock.Verify(); 


5. рд╕рддреНрдпрд╛рдкрди () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдИ рдХреЙрд▓ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ред

рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХрдИ рдХреЙрд▓ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдПрдХ рдирдХрд▓реА рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реЗрдЯрдЕрдк рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрди рд╕рднреА рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреЛ рдПрдХ рд╕рддреНрдпрд╛рдкрд┐рдд () рд╡рд┐рдзрд┐ рдХрд╣рдХрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдкрд░реАрдХреНрд╖рдг рдХреА рд╕реЗрдЯрдЕрдк рд╡рд┐рдзрд┐ рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рдирдХрд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдРрд╕реА рддрдХрдиреАрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддреА рд╣реИред

 var mock = new Mock<ILogWriter>(); mock.Setup(lw => lw.Write(It.IsAny<string>())); mock.Setup(lw => lw.SetLogger(It.IsAny<string>())); var logger = new Logger(mock.Object); logger.WriteLine("Hello, logger!"); mock.Verify(); 


рд╡рд┐рд╖рдп рд╕реЗ рд╡рд┐рдЪрд▓рдиред рд╕рдЦреНрдд рдмрдирд╛рдо рдвреАрд▓реЗ рдореЙрдбрд▓



Moq рджреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░реАрдХреНрд╖рдг рдореЙрдбрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ: рд╕рдЦреНрдд рдФрд░ рдвреАрд▓реЗред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдПрдХ рдирд┐: рд╢реБрд▓реНрдХ рдкрд░реАрдХреНрд╖рдг рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди (рдПрдХреНрдЯ рд╕реЗрдХреНрд╢рди рдореЗрдВ) рдЯреЗрд╕реНрдЯ рдХреНрд▓рд╛рд╕ (рдХреНрд▓рд╛рд╕ рдЕрдВрдбрд░ рдЯреЗрд╕реНрдЯ, CUT), рд╣рдорд╛рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдХрд┐рд╕реА рднреА рддрд░реАрдХреЗ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдЙрди рд╕рднреА рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рддреЛ, рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ .WriteLine рд╡рд┐рдзрд┐ ILogWriter рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рджреЛ рддрд░реАрдХреЗ рдХрд╣рддрд╛ рд╣реИ: рд▓рд┐рдЦреЛ рд╡рд┐рдзрд┐ рдФрд░ SetLogger ред MockBehavior .Strict рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп , рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдзрд┐ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧреА рдпрджрд┐ рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реА рд╕рдЯреАрдХ рдирд┐рд░реНрднрд░рддрд╛ рд╡рд┐рдзрд┐рдпрд╛рдБ рдХрд╣рд▓рд╛рдПрдБрдЧреА :

 var mock = new Mock<ILogWriter>(MockBehavior.Strict); //      ,  //  mock.Verify()    mock.Setup(lw => lw.Write(It.IsAny<string>())); mock.Setup(lw => lw.SetLogger(It.IsAny<string>())); var logger = new Logger(mock.Object); logger.WriteLine("Hello, logger!"); mock.Verify(); 


MockRepository рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛



MockRepository рд╡рд░реНрдЧ, рд╕реНрдЯрдмреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдПрдХрд▓ рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдХрдИ рдирдХрд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

1. Stock рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП MockRepository .Of рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ Mock .Of рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдкрдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ && рдСрдкрд░реЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ:

 var repository = new MockRepository(MockBehavior.Default); ILoggerDependency logger = repository.Of<ILoggerDependency>() .Where(ld => ld.DefaultLogger == "DefaultLogger") .Where(ld => ld.GetCurrentDirectory() == "D:\\Temp") .Where(ld => ld.GetDirectoryByLoggerName(It.IsAny<string>()) == "C:\\Temp") .First(); Assert.That(logger.GetCurrentDirectory(), Is.EqualTo("D:\\Temp")); Assert.That(logger.DefaultLogger, Is.EqualTo("DefaultLogger")); Assert.That(logger.GetDirectoryByLoggerName("CustomLogger"), Is.EqualTo("C:\\Temp")); 


2. рдХрдИ рдирдХрд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП MockRepository рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕реНрдорд╛рд░реНрдЯрд▓реЙрдЧрд░ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕реЗ рджреЛ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: ILogWriter рдФрд░ ILogMailer ред рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рд╡рд░реНрдЧ, рдЬрдм рдЗрд╕рдХреА рд▓рд┐рдЦрдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рджреЛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

 var repo = new MockRepository(MockBehavior.Default); var logWriterMock = repo.Create<ILogWriter>(); logWriterMock.Setup(lw => lw.Write(It.IsAny<string>())); var logMailerMock = repo.Create<ILogMailer>(); logMailerMock.Setup(lm => lm.Send(It.IsAny<MailMessage>())); var smartLogger = new SmartLogger(logWriterMock.Object, logMailerMock.Object); smartLogger.WriteLine("Hello, Logger"); repo.Verify(); 


рдЕрдиреНрдп рддрдХрдиреАрдХреЗрдВ



рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдпрдВ рдореЙрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ( ISomething рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Mock <ISomething > рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯрдмреНрд╕ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрдВрдХреНрд╢рдирд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдПрдХ рдореЙрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддреБрд░рдВрдд рдЖрд╡рд╢реНрдпрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред рдпрд╣ рд╕рд░рд▓ рддрд░реАрдХреЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛ рдПрдХ рдРрд╕рд╛ рддрд░реАрдХрд╛ рд╕реЗрдЯ рдХрд░реЗрдВ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рддреЛ рдХрднреА-рдХрднреА рддрд░реАрдХреЛрдВ рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд▓рд┐рдП LINQ- рдЖрдзрд╛рд░рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрдЕрдк рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрддрд╛ рд╣реИ:

 ILoggerDependency logger = Mock.Of<ILoggerDependency>( ld => ld.GetCurrentDirectory() == "D:\\Temp" && ld.DefaultLogger == "DefaultLogger"); //      GetDirectoryByLoggerName //    ,     Mock.Get(logger) .Setup(ld => ld.GetDirectoryByLoggerName(It.IsAny<string>())) .Returns<string>(loggerName => "C:\\" + loggerName); Assert.That(logger.GetCurrentDirectory(), Is.EqualTo("D:\\Temp")); Assert.That(logger.DefaultLogger, Is.EqualTo("DefaultLogger")); Assert.That(logger.GetDirectoryByLoggerName("Foo"), Is.EqualTo("C:\\Foo")); Assert.That(logger.GetDirectoryByLoggerName("Boo"), Is.EqualTo("C:\\Boo")); 


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, Moq рдЖрдкрдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЛрдВ, рдкрд░реАрдХреНрд╖рдг рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рд╕рдВрдмрдВрдзрд┐рдд рд▓рд┐рдВрдХ



рдЧрд┐рдердм рдЙрджрд╛рд╣рд░рдг
рдореЛрдХреА рдФрд░ рд╕реНрдЯрдмреНрд╕
Microsoft рдореЛрд▓реНрд╕

Source: https://habr.com/ru/post/In150859/


All Articles