C#:带静态类的DI用于单元测试

时间:2016-01-12 17:32:44

标签: c# .net unit-testing dependency-injection interface

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

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

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

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

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

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

我不想创建实例方法,因为实例会增加工作集。

2 个答案:

答案 0 :(得分:3)

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

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

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

<小时/> 对不起 - 刚看到这一点....

  

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

我不确定它是否符合此要求,但改变的足迹是相对较小的IMO。就个人而言,我同意@DStanleys的评论。

答案 1 :(得分:1)

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

一旦您的磁带库满足测试,您可以将这些作为安全网,同时引入适当的DI,如果需要,可以删除静态和完全隔离的测试。

危险在于垫片是邪恶的,可以让开发人员摆脱不良行为。