我一直在寻找可用于访问静态类的方法,该静态类包含用于单元测试的私有静态方法。
我遇到PrivateObject
和PrivateType
,我不明白它们之间的区别是什么,以及您将如何决定使用其中任何一个。
BusinessLogic
public static Class BarLogic(){
private static void FooBar(){
//do something here
}
}
API
public class FooService(){
BarLogic.FooBar();
}
答案 0 :(得分:1)
区别在于您是否正在访问其他无法访问的实例成员或静态成员。
在下面的示例中,您可以使用PrivateObject
访问_someInstanceField
,使用PrivateType
访问_someStaticField
。
public class SomeObjectWithInAccessibleMembers
{
private int _someInstanceField;
private static int _someStaticField;
}
鉴于您的测试是在此类的单独程序集中(因此无法查看其内部成员),您可以执行此操作:
var privateObject = new PrivateObject(new SomeObjectWithInAccessibleMembers());
privateObject.SetField("_someInstanceField", 1);
Assert.AreEqual(1, privateObject.GetField("_someInstanceField"));
var privateType = new PrivateType(typeof(SomeObjectWithInAccessibleMembers));
privateType.SetStaticField("_someStaticField", 1);
Assert.AreEqual(1, privateType.GetStaticField("_someStaticField"));
我从未使用过这个。我甚至都不知道。我的第一反应是它将测试与类的内部实现相结合,而不是测试其公共方法。然后它通过使用成员名称的字符串来结合它,因此测试可以通过更改成员名称来解决。
另一方面,我曾参与过以下项目:a)我想添加单元测试,但b)我无法重构以使其更易于测试。这不是我的第一选择,但我可能会对此有所帮助。谢谢!