MVC控制器对静态服务类的依赖性——可测试性问题



我是测试新手,正在考虑在维护中对一些遗留代码进行单元测试。控制器是围绕获取数据的静态服务调用构建的。我不确定前进的最佳路径,但我想要么将静态类重组为实例类,要么深入研究可测试性方法。这个代码片段只是我反复遇到的一个简单的例子。提前谢谢你的建议。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来帮助您从静态到实例的转换,并将代码委托给静态实现。

最新更新