2016-01-12 89 views
1

我有一些遗留代码访问我们的数据库。我想为单元测试中的IoC/DI的每个类创建一个接口。C#:单元测试静态类的DI

这些类中的所有方法都是静态的。

当我尝试通过VisualStudio“提取一个接口”时,它失败并且说“无法提取接口:该类型不包含任何可以提取到接口的成员”。

有一些链接可以解释为什么接口不应该有静态方法herehere

这个限制似乎主要是为了支持多态性......我现在并不真正在意这些类,它们并不真正从任何东西(除了Object)继承。

那么,如何使用IoC来获取我可以从中提取数据的对象?

我宁愿不制作实例方法,因为实例增加了工作集。

+3

你不能“注入”静态类 - 它们在编译时绑定。如果你想使用注入,你必须注入实例。我建议克服你对“增加工作集”的恐惧,并处理这个问题,当它成为问题时。 –

+1

*“多态性[我]现在并不在乎。”*是的,你这样做,因为你会*想为单元测试中的IoC/DI的每个类创建一个接口。“* –

回答

3

一种技术可能是用包装器将静态类抽象掉。

public MyStaticWrapper : IMyStaticWrapper 
{ 
    public void SomeMethod(string something) 
    { 
     MyStatic.SomeMethod(something); 
    } 
} 

然后你可以在需要的地方注入IStaticWrapper


对不起 - 只是看到了这一点....

我宁愿不作实例方法,因为实例增加 工作集。

我不确定它是否能够满足这个要求,但是变化的影响是相对较小的IMO。我个人同意@DStanleys的评论。

+0

显然静态类被高估了,因为它们不会非常大地减少占用空间。 http://stackoverflow.com/questions/241339/when-to-use-static-classes-in-c-sharp – micahhoover

1

根据目标,您可以使用Microsoft Fakes之类的东西,尤其是shims来拦截静态调用以将遗留代码置于测试工具之下。

一旦你的图书馆被测试覆盖,你可以把这些作为安全网,当你引入适当的DI,如果需要的话去掉静态图和完全隔离的测试。

危险在于垫片是邪恶的,可以让开发者摆脱不良做法。