基于接口的编程的独立示例和详细说明

时间:2011-01-06 06:22:01

标签: c# interface mocking standards

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

你可以很容易地通过模拟进行测试(无需模拟类,这会变得难看)

我希望通过一个独立的例子来详细了解这个方面...... C#中的before(丑陋)和after(基于接口)场景。

另外,如果.NET Framework BCL本身有一个很好的例子

2 个答案:

答案 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是一个管理数据库之类资源访问的类。