回答这个问题here Jon Skeet回答:>>
你可以很容易地通过模拟进行测试(无需模拟类,这会变得难看)
我希望通过一个独立的例子来详细了解这个方面...... C#中的before(丑陋)和after(基于接口)场景。
另外,如果.NET Framework BCL本身有一个很好的例子
答案 0 :(得分: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));
在测试之前将文件写入文件系统可能听起来不像很多设置,但是如果你运行了很多测试,它就会变得一团糟。通过使用接口和模拟,所有设置都在您的测试方法中进行。
答案 1 :(得分:0)
public class A
{
private B _instanceOfB;
public void DoSomethingWithInstanceOfB()
{
// do something with _instanceOfB
}
}
如果你想模拟A,你不仅要在整个代码中提取界面和重构 - 而且你可能也需要开始模拟B.等等,在企业环境中可能是无限的。一个具体的例子可能是,如果B是一个管理数据库之类资源访问的类。