2011-01-06 54 views
4

在回答这个问题here乔恩斯基特回答:>>独立实例和阐述基于接口的编程

您可以通过嘲弄真的很方便的测试(而不必mock类,它得到丑陋)

我希望通过阐述这个方面的独立示例更好地理解...... C#中之前(丑陋)和后(基于接口)场景。

并且还,另外,如果是.NET Framework BCL本身的一个例子将是巨大的

回答

3

说你有这个方法从文件读取的所有的人的名字:

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

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

0

如果您重构现有代码,模仿类可能会变得很难看。想象一下,一个类:

public class A 
{ 
    private B _instanceOfB; 

    public void DoSomethingWithInstanceOfB() 
    { 
     // do something with _instanceOfB 
    } 
} 

如果你想嘲笑A,你不仅需要提取整个代码的接口和重构 - 但你很可能需要开始嘲讽B中好。在企业环境中,可能无限次地这样。一个具体的例子可能是如果B是一个类来管理像资料库这样的资源。