2013-10-15 59 views
0

我有一个MVC项目,其中控制器由两个基类中的以下结构得出:构建测试为继承架构

Global Base Controller 
| 
|--------------------| 
Type1    Type2 
|     | 
|--------------------------------------| 
Controller1/Controller2   Controller3/Controller4 

我想设置我的单元测试,这样我只测试任何重写方法在控制器1/2/3/4中,以便我坚持DRY主体。这意味着如果我将测试添加到Global Base Controller中,它们将会沿着链条进一步应用。

用NUnit/msTest实现这一点的最佳方法是什么?

我试图在与试验按下面的例子相同的结构,但是基部测试没有拿起:

public class ControllerTestClass<T> 
{ 
    public class ForThisMethod 
    { 
     [Test] 
     public void WhenThisCondition_HasThisValue() 
     { 
      Assert.IsAssignableFrom<T>(""); 
     } 
    } 
} 

public class UnitTest2 : ControllerTestClass<String> 
{ 
    [TestFixture] 
    public class ForThisMethod2 
    { 
     [Test] 
     public void WhenThisCondition_HasThisValue() 
     { 
      Assert.True(true); 
     } 
    } 
} 

利用上述结构时,可以看到测试资源管理器执行以下操作:

Result from Test Explorer

注:我知道,在这样的测试将需要的新功能开发人员添加额外的测试。这很好,并将写入项目说明。

回答

0

我认为你需要以与你的实现代码相同的方式来思考你的测试,但不那么“正式”的方式。你正在试图将你的测试代码复杂化。危险之处在于,您可能最终花费的时间和精力将您的测试代码作为您的实现代码进行管理。

我所做的是使用继承的常用功能,以便我可以减少编写相同的代码(我相信你正在尝试实现相同的代码),但我知道我必须重复一些测试代码,这很好,因为它意味着我不必管理它们。

一般来说,如果你必须编写太多相同的测试方法,那么你可能会犯。需要重新考虑你的实现设计和概率。需要引入使用IoC/DI或类似技术的代码管理。这样你的泛型代码将只有有限数量的测试,并且所有其他特定于不同功能的代码都将进行分类测试。 (希望这是有道理:))