【问题标题】:Standalone example and elaboration for interface based programming基于接口的编程的独立示例和详细说明
【发布时间】:2011-06-04 11:36:02
【问题描述】:

回答这个问题here Jon Skeet 回答:>>

您可以非常轻松地通过模拟进行测试(无需模拟类,这会变得很丑)

我想通过一个独立的例子来更好地理解这个方面...... C# 中的之前(丑陋的)和之后(基于接口的)场景。

此外,如果 .NET Framework BCL 本身有一个示例,那就太好了

【问题讨论】:

    标签: c# interface mocking standards


    【解决方案1】:

    假设您有这种方法可以从文件中获取所有人员的姓名:

    string[] GetNamesFrom(string path) { }
    

    要测试此方法,您必须提供现有文件的路径名,这需要一些设置。

    与此方法比较:

    string[] GetNamesFrom(IFile file)
    

    如果IFile 包含GetContents() 方法,那么你的这个接口的“真实”实现可以访问文件系统,你的模拟类可以简单地返回你的测试输入数据。

    使用像 moq (http://code.google.com/p/moq/) 这样的模拟库变得非常简单:

    var fileMock = new Mock<IFile>();
    fileMock.Setup(f => f.GetContents()).Returns(testFileContents));
    Assert.Equals(expectedNameArray, GetNamesFrom(fileMock.Object));
    

    在测试之前将文件写入文件系统可能听起来不像很多设置,但如果您运行大量测试,它就会变得一团糟。通过使用接口和模拟,所有设置都在您的测试方法中进行。

    【讨论】:

      【解决方案2】:

      如果您要重构现有代码,模拟类可能会变得丑陋。想象一个类:

      public class A
      {
          private B _instanceOfB;
      
          public void DoSomethingWithInstanceOfB()
          {
              // do something with _instanceOfB
          }
      }
      

      如果您想模拟 A,您不仅需要提取接口并在整个代码中重构——而且您可能还需要开始模拟 B。依此类推,在企业环境中可能无限。一个具体的例子可能是如果 B 是一个管理对数据库等资源的访问的类。

      【讨论】:

        猜你喜欢
        • 2016-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-18
        • 2017-11-24
        相关资源
        最近更新 更多