C#中PrivateObject与PrivateType有什么区别?

时间:2018-02-14 17:40:17

标签: c# unit-testing

我一直在寻找可用于访问静态类的方法,该静态类包含用于单元测试的私有静态方法。

我遇到PrivateObjectPrivateType,我不明白它们之间的区别是什么,以及您将如何决定使用其中任何一个。

BusinessLogic

public static Class BarLogic(){
  private static void FooBar(){
       //do something here
   }
}

API

public class FooService(){

BarLogic.FooBar();

}

1 个答案:

答案 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)我无法重构以使其更易于测试。这不是我的第一选择,但我可能会对此有所帮助。谢谢!