我需要在我的公共类中测试一个公共方法,但是该方法的输入是一个私有嵌套类。因此,我需要创建此私有嵌套类的实例,以对my方法进行适当的测试。
此嵌套类具有由构造函数设置的属性,并且有一个表达式增强成员定义的只读属性,该成员从构造函数设置的属性中提取一些信息。
我设法通过反射创建了私有类的实例。我现在正在尝试获取Backfield来设置此属性的值。但是,当我得到后场时,它返回null。特别是当我尝试使用字符串列表设置背景字段的值时,它给了我一个空引用异常。
可以做,我想做什么?这是一些伪代码:
public class Class1
{
private class Class2
{
public SomeClass Input { get; }
public List<string> GetInformation => Input.something.something...
public Class2 (someClass input)
{
Input = input;
}
}
public void someMethod(Class2 input)
{
List<string> info = input.GetInformation();
some code here ...
}
}
public class TestClass
{
public void testingSomeMethod
{
List<string> list = new List<string> { "1", "2", "3" };
//need instance of Class2 to invoke someMethod
var typeOfClass2 = typeof(Class1)
.GetNestedType("Class2", BindingFlags.NonPublic |
BindingFlags.Instance);
var instanceOfClass2 =
Activator.CreateInstance(typeOfClass2,true);
// null reference exception here. GetProperty return null.
instanceOfClass2
.GetType()
.GetProperty("<GetInformation>k__BackingField", BindingFlags.NonPublic |
BindingFlags.Instance)
.SetValue(instanceOfClass2, list);
}
}
我使方法
public
能够测试方法
这不是您决定成员可访问性的方式。如果适合外部使用者,则方法为public
。否则,您将尝试测试类的内部实现细节,这令人担忧,并指出可能的设计味道-如果该部分非常重要,以至于需要进行单独的单元测试,那么也许它执行的功能与是Class1
的责任还是更可重用的组件,应提取到实际的单独internal
类中? You can (and should) test internal classes using the InternalsVisibleToAttribute
。