2011-08-20 70 views
2

我正在处理一个基本上没有单元测试覆盖率的大型代码库。我们即将开始朝着更多的测试驱动的方式移动,所以我想我会尝试写单元测试一个非常简单的函数,我添加,基本上如何测试有很多依赖关系的代码

class ClassUnderTest { 
    public void SetNoMatchingImage() { 
     currentState.State = FSMState.NoMatchingImage; 
     ... // Some more logic 
     NotifyViews(); 
    } 

    public ViewStatus GetStatus() { 
     ... 
     if (currentState.State == FSMState.NoMatchingImage) 
      return ViewStatus.EmptyScreen; 
     ... 
    } 

    ... 
} 

好了,测试这个,我只想喜欢做的事:

[Test] 
public void TestSetNoMatchingImage() { 
    ClassUnderTest view = new ClassUnderTest(...); 
    view.SetNoMatchingImage(); 
    Assert.AreEqual(ViewStatus.EmptyScreen, view.Status); 
} 

但在这里我的问题是,ClassUnderTest构造函数接受3个参数到非接口不能为空,所以我不能很容易地创建一个ClassUnderTest。我可以尝试创建这些类的实例或对它们进行存根,但问题对于它们来说是一样的:每个构造函数都需要创建参数。这个问题与...相同。结果当然是非常大的开销,即使对于非常简单的测试也需要很多代码。

是否有一种处理这种情况的好方法,使测试用例更容易编写?

+0

难道你不能只为你的classundertest创建一个门面模型吗? –

回答

2

如果开始重构项目而不进行测试,如果它不是考虑依赖注入的设计,并且您使用的模拟框架不能模拟具体类(如NMock),那么您将会遇到很多像这样的情况。正如刚刚提到的Andriys,Typemock(和moq也可以)只要具有虚拟成员就可以嘲笑具体的类。

就个人而言,我会从这三个类的每一个中提取一个接口,并将接口作为一些重构的一部分注入,以使该类易于测试。我不记得VS是否有重构来提取2次点击的界面,这不会花太长时间。

1

我会建议看看Typemock Isolator框架。据罗伊Osherove单元测试书的艺术,它遗留代码编写单元测试时,是你最好的选择:

...它是唯一一个[框架],可让您在创建依赖的存根和嘲笑生产代码,根本不需要重构它,节省了将测试组件带入宝贵的时间。

干杯!