我是测试新手,正在考虑在维护中对一些遗留代码进行单元测试。控制器是围绕获取数据的静态服务调用构建的。我不确定前进的最佳路径,但我想要么将静态类重组为实例类,要么深入研究可测试性方法。这个代码片段只是我反复遇到的一个简单的例子。提前谢谢你的建议。staticMedServiceHelper是一个静态类,具有利用WCF ChannelFactory等的静态Use方法。顺便说一句,如果你有任何关于WCF/MVC/Testing的好的学习资源,请告诉我。再次感谢。
public ActionResult Documents(DocumentsForRequirementViewModel model)
{
staticMedServiceHelper<IMedService>.Use(proxy =>
{
var requirment = proxy.GetRequirementById(model.Id);
var dtos = (IEnumerable<DocumentDTO>)requirement.GetType().GetProperty(model.PropertyName).GetValue(requirement, null);
model.Documents = Mapper.Map(dtos, new List<DocumentViewModel>());
});
return PartialView(model);
}
我打破依赖关系的技巧很简单:对于静态,将它们封装在实例类中。
假设你有一个静态记录器(我真的在生产代码中看到过)
public static class Logger
{
public static void Log(string message)
{
//logging logic here..
}
}
public ActionResult Documents(DocumentsForRequirementViewModel model)
{
Logger.Log("GET action on Documents");
//bla bla
}
在这种情况下,对记录器的静态实现的依赖性是明确的。
我们可以创建一个新的记录器:
public class LogWrapper
{
public void Log(string message)
{
Logger.Log(message);
}
}
在我们的代码中使用它:
public ActionResult Documents(DocumentsForRequirementViewModel model)
{
LogWrapper logger = new LogWrapper();
loggerr.Log("GET action on Documents");
}
注:
这只是一个简单的例子。通常情况下,所有外部依赖项都将首先进行Interfaced,然后对于静态实现,只需创建一个实例包装器。
如果您需要更复杂的dependency场景,您可以创建Decorator来帮助您从静态到实例的转换,并将代码委托给静态实现。