2010-09-10 82 views
9

所以我有一个类,它看起来像这样:测试一类具有一个静态类/方法依赖

public class MyClassToTest() 
{ 
    MyStaticClass.DoSomethingThatIsBadForUnitTesting(); 
} 

和静态类,看起来像这样:

public static class MyStaticClass() 
{ 
    public static void DoSomethingThatIsBadForUnitTesting() 
    { 
     // Hit a database 
     // call services 
     // write to a file 
     // Other things bad for unit testing 
    } 
} 

(显然,这是一个愚蠢的例子)

所以,我知道第二类是注定的单元测试,但有什么办法解耦MyClassToTest类,以便我可以测试它(没有即时iating MyStaticClass)。基本上,我希望它忽略这个呼叫。

注:可悲的是,这是一个Compact Framework的项目,所以像鼹鼠和Typemock隔离工具无法使用:(

+0

什么语言?我可以在Python中想到几件事情,但这看起来像Java。 – wheaties 2010-09-10 21:10:52

+0

@wheaties - 抱歉,我应该说... C#(Visual Studio 2008) – Vaccano 2010-09-10 21:11:49

回答

12

定义,做同样的事情DoSomethingThatIsBadForUnitTesting,例如接口:

public interface IAction { 
    public void DoSomething(); 
} 

(显然,在实际的代码,你会选择更好的名称)

然后,你可以写的类使用一个简单的包装在生产代码:

public class Action : IAction { 
    public void DoSomething() { 
     MyStaticClass.DoSomethingThatIsBadForUnitTesting(); 
    } 
} 

MyClassToTest中,您通过其构造函数传入IAction的实例,并调用该实例上的方法而不是静态类。在生产代码中,您传入具体类Action,以便代码像以前一样运行。在单元测试中,您传递一个模拟对象,实现IAction,使用模拟框架或滚动自己的模拟。

+1

Oooooooh,好东西。我试试看! – Vaccano 2010-09-10 21:22:16

+0

+1很好的答案。 OP说“没有实例化MyStaticClass” - 关键是你需要实例化SOMETHING,以便从动态方法绑定中获益。 – 2010-09-10 21:25:48

+2

+1,这是朝着不再实施具有副作用或静态访问的单例的静态调用的第一步。适配器对象可以帮助您在测试中获得具有静态依赖关系的现有代码。最终,目的是完全解决有问题的静态调用。 – 2010-09-10 21:33:17