如何提供Seam的干净实现

时间:2011-10-25 06:47:04

标签: unit-testing moq

在许多情况下,我使用受保护的虚拟方法编写代码以提供接缝(以帮助进行单元测试):

public class TemporaryStorage     
{
    public TemporaryStorage()
    {
     this.RootPath = Path.Combine(this.GetEnvironmentPath, Path.GetRandomFileName());
    }
    public string RootPath { get; private set; }
    protected virtual string GetEnvironmentPath
    {
         get { return LocalStorage.GetEnvironmentPath(); }
    }
}

然后,在测试套件中,我将从这个类派生并为GetEnvironmentPath()提供自定义实现。

不是在测试套件中创建派生类,而是提供更好的方法吗?我可以使用MOQ来完成相同的结果(为GetEnvironmentPath提供替代实现)吗?

此致

2 个答案:

答案 0 :(得分:1)

模拟测试中的类的最简单方法是使用接口。当您的测试类实现某个接口时,您可以使用MOQ编写模拟,如下所示:

比方说,你有一个这样的界面:

private interface IMyInterface
{
    string MyMethod(int value);

    int MyProperty { get; set; }
}

然后你可以像这样配置一个模拟:

var mockedObject = new Mock<IMyInterface>();
mockedObject.Setup(x => x.MyMethod(It.IsAny<int>())).Returns<int>(value => value.ToString());
mockedObject.SetupGet(x => x.MyProperty).Returns(42);

您可以通过以下方式访问单元测试中的模拟对象:

DoSomething(mockedObject.Object);

答案 1 :(得分:0)

Rhino Mocks是支持此功能的模拟框架之一。

如果您查看以下信息,则会看到example

要确保受保护的方法可以进行单元测试,您可以将签名更改为内部受保护而不是受保护。如果您随后在AssemblyInfo.cs中使用InternalsVisibleTo,则可以使单元测试项目的内部可见(请参阅How to make a "protected" method available for "partial" mocking using RhinoMocks)。