在许多情况下,我使用受保护的虚拟方法编写代码以提供接缝(以帮助进行单元测试):
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提供替代实现)吗?
此致
答案 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)。