在回答这个问题here乔恩斯基特回答:>>独立实例和阐述基于接口的编程
您可以通过嘲弄真的很方便的测试(而不必mock类,它得到丑陋)
我希望通过阐述这个方面的独立示例更好地理解...... C#中之前(丑陋)和后(基于接口)场景。
并且还,另外,如果是.NET Framework BCL本身的一个例子将是巨大的
在回答这个问题here乔恩斯基特回答:>>独立实例和阐述基于接口的编程
您可以通过嘲弄真的很方便的测试(而不必mock类,它得到丑陋)
我希望通过阐述这个方面的独立示例更好地理解...... C#中之前(丑陋)和后(基于接口)场景。
并且还,另外,如果是.NET Framework BCL本身的一个例子将是巨大的
说你有这个方法从文件读取的所有的人的名字:
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));
写一个文件到文件系统之前测试听起来不像设置的很多,但如果你运行了很多的测试,它变得一团糟。通过使用接口和模拟,所有设置都在您的测试方法中进行。
如果您重构现有代码,模仿类可能会变得很难看。想象一下,一个类:
public class A
{
private B _instanceOfB;
public void DoSomethingWithInstanceOfB()
{
// do something with _instanceOfB
}
}
如果你想嘲笑A,你不仅需要提取整个代码的接口和重构 - 但你很可能需要开始嘲讽B中好。在企业环境中,可能无限次地这样。一个具体的例子可能是如果B是一个类来管理像资料库这样的资源。