【发布时间】:2011-06-04 11:36:02
【问题描述】:
回答这个问题here Jon Skeet 回答:>>
您可以非常轻松地通过模拟进行测试(无需模拟类,这会变得很丑)
我想通过一个独立的例子来更好地理解这个方面...... C# 中的之前(丑陋的)和之后(基于接口的)场景。
此外,如果 .NET Framework BCL 本身有一个示例,那就太好了
【问题讨论】:
标签: c# interface mocking standards
回答这个问题here Jon Skeet 回答:>>
您可以非常轻松地通过模拟进行测试(无需模拟类,这会变得很丑)
我想通过一个独立的例子来更好地理解这个方面...... C# 中的之前(丑陋的)和之后(基于接口的)场景。
此外,如果 .NET Framework BCL 本身有一个示例,那就太好了
【问题讨论】:
标签: c# interface mocking standards
假设您有这种方法可以从文件中获取所有人员的姓名:
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 是一个管理对数据库等资源的访问的类。
【讨论】: