【问题标题】:C#: DI with static class for unit testsC#:带有静态类的 DI 用于单元测试
【发布时间】:2016-04-17 10:53:22
【问题描述】:

我有一些旧代码可以访问我们的数据库。我想为单元测试中的 IoC/DI 类中的每一个类创建一个接口。

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

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

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

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

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

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

【问题讨论】:

  • 你不能“注入”静态类——它们是在编译时绑定的。如果要使用注入,则必须注入实例。我建议克服您对“增加工作集”的恐惧,并处理如果以及何时成为问题
  • "多态性 [...] 我现在并不真正关心。" 是的,你关心,因为你"想创建一个为单元测试中的 IoC/DI 这些类中的每一个提供接口。”

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


【解决方案1】:

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

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

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


抱歉 - 刚刚看到这一点......

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

虽然我不确定它是否会满足此要求,但更改的足迹相对较小 IMO。我个人同意@DStanleys 的评论。

【讨论】:

【解决方案2】:

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

一旦你的库被测试覆盖,你可以在引入适当的 DI 时将它们作为安全网,如果需要,可以删除静态和完全隔离的测试。

危险在于 shims 是邪恶的,可以让开发人员侥幸逃脱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多