2017-08-03 81 views
0

我试图单元测试添加到现有的代码库和我在第一障碍几乎下降通话重构由于该网站是如何构建的。单元测试 - 如何静态类

给你一些细节,在这个网站每个控制器从名为SiteController一个基本控制器继承和控制器的构造函数使用静态辅助类填充一些数据。

例如

public class HomeController : SiteController 
    { 
     public ActionResult Index() 
     { 
      //Do stuff here 
     }  
    } 

而这里的基本控制器

public class SiteController 
{ 
    public SiteController() 
    { 
     viewModel = CategoryHelper.GetAllCategories(); 
    } 
} 

和静态GetAllCategories helper方法

public static class CategoryHelper 
    { 
     public static IList<string> GetAllCategories() 
     { 
      //Go off and get the categories from the WCF layer 
      return _categories; 
     } 
    } 

我不能嘲笑一个静态的类,但我怎么能重构这段代码,以便我可以使用单元测试来处理它。我们已经在整个站点使用了DI,并且我知道这里的理论 - 我应该将这个静态类包装在一个抽象层中,无论如何这对于代码来说都更好。但是这个我不太确定的实用性。

这也可能是显而易见的,但我在这里的目的是为了保持现场工作(明显),而且还改写静态类或调用它以这样一种方式,我可以针对它的单元测试。我是新编写单元测试的,所以我只是在遇到这些问题之前得到满意的结果,即使是通过一个测试也能看到一个绿色标记!这很令人沮丧,而且当我知道理论解决方案时更是如此,但是不知道该怎么做才能让课堂上的问题得到解决。

+0

你可以更具体一点你不确定哪一点?你几乎完全描述了你需要做的事情,所以我不清楚是什么让你沮丧。 –

+1

或者不使用包装*仅使用静态类* – BradleyDotNET

+0

实际问题是什么? “我如何在单元测试中使用它”是一个不起步的程序。你可以用它来使用它。尽管在很多情况下理想情况下应该避免使用“静态”,而且通常是过度使用或者错误使用,但这本质上并不正确。 *您遇到的*实际问题*是什么? – David

回答

2
public class HomeController : SiteController 
{ 
    public HomeController(ICategoryHelper categoryHelper) : base(categoryHelper) 
    { 
    } 

    public ActionResult Index() 
    { 
     //Do stuff here 
    }  
} 

public class SiteController 
{ 
    public SiteController(ICategoryHelper categoryHelper) 
    { 
     viewModel = categoryHelper.GetAllCategories(); 
    } 
} 

public class CategoryHelper : ICategoryHelper 
{ 
    public IList<string> GetAllCategories() 
    { 
     //Go off and get the categories from the WCF layer 
     return _categories; 
    } 
} 

public interface ICategoryHelper 
{ 
    IList<string> GetAllCategories(); 
} 

最重要的是对抽象而不是具体的类进行编码。 CategoryHelper是一个具体的类,你希望你的控制器能够利用一些执行工作的东西而不关心它是如何完成的。所以你的控制器应该在它们的构造函数中接受一个接口(如果需要,可以将它传递给基本控制器)。

同样,CategoryHelper应该实现一个接口,这基本上是一个合同说:“我可以执行ICategoryHelper的工作。”

然后,线了CategoryHelper,以满足您的依赖注入的ICategoryHelper依赖。你怎么做取决于你使用的具体工具(AutoFac,Ninject,SimpleInjector等)。

注:缓存模式可以在这里更好,如果类不经常改变。

相关问题