【发布时间】: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 创建了一个新对象,然后将其添加到列表中。
我的问题:
- 该方法是无效的,那么测试它的正确方法是什么?只需确保没有错误发生即可?
- 如果我要注入假类(例如假的 MyHelperWrapper),那么我基本上是在绕过一堆代码。这对我来说似乎很糟糕?
- 如果我要继续这条路线,如何为 MyObject 注入一个假类?这似乎有点糟糕,因为我没有测试该对象是否按我的预期创建。
- 有没有更好的方法?也许我也必须重构 MyObject 以使用 DI,但这一切似乎有点 hacky,只是为了测试一个对象是否已添加到列表中。
【问题讨论】:
-
说到测试,你可以把
static读作untestable。DI的整个想法是摆脱static。
标签: c# dependency-injection static nunit clr