【问题标题】:How can you use dependency injection when creating an object inside of a static method?在静态方法中创建对象时如何使用依赖注入?
【发布时间】:2020-07-03 04:48:01
【问题描述】:

我有一个包含几个静态方法的类,这些方法在 CLR SQL 存储过程方法中使用。我最终用非静态方法编写了一个包装器,它实现了我想要的方法的接口。

我这样做是为了编写单元测试。但是,单元测试是针对静态方法的,该方法还具有另一个我不知道如何解决的依赖项。

注意:CLR 存储过程需要是静态的。

public class MyHelperWrapper : IMyHelper
{
    public void DoStuff(List<MyObject> list)
    {
        MyHelper.DoStuff(list); // Static method that sends data to database.
    }
}

public class FakeMyHelperWrapper : IMyHelper
{
    public void DoStuff(List<MyObject> list)
    {
        // don't do anything??
    }
}


public class MyCLRClass
{

    public static void My_Stored_Proc(string a, string b)
    {
        MyPrivateStaticMethod(a, b);
    }


    private static void MyPrivateStaticMethod(string a, string b)
    {
        List<MyObj> list = new List<MyObject>();
        MyObject obj = new MyObject(a, b);
        list.Add(obj);

        MyHelperWrapper.DoStuff(list); // MyWrapper is wrapped around the static methods of the class MyHelper
    }

    private static string Format(string b)
    {
        // ... format ...
        return bFormatted;
    }
}

最后,我想我真的只需要测试该方法是否基于参数 a 和 b 创建了一个新对象,然后将其添加到列表中。

我的问题:

  1. 该方法是无效的,那么测试它的正确方法是什么?只需确保没有错误发生即可?
  2. 如果我要注入假类(例如假的 MyHelperWrapper),那么我基本上是在绕过一堆代码。这对我来说似乎很糟糕?
  3. 如果我要继续这条路线,如何为 MyObject 注入一个假类?这似乎有点糟糕,因为我没有测试该对象是否按我的预期创建。
  4. 有没有更好的方法?也许我也必须重构 MyObject 以使用 DI,但这一切似乎有点 hacky,只是为了测试一个对象是否已添加到列表中。

【问题讨论】:

标签: c# dependency-injection static nunit clr


【解决方案1】:

我解决这个问题的方法是将依赖项(导致问题的)注入 MyObject 的构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多