C#:如何实例化私有内部类的List?

时间:2017-03-10 03:41:23

标签: c# unit-testing reflection

大家。我现在正在进行单元测试,而我有一个问题,我无法自己解决。 问题列在下面:

public class A {
    private class B{ }
    private List<B> list = new List<B>;
}

我想测试list[i]是否null?现在我可以使用Reflection来获取列表,但问题是如何在列表中添加B的实例? 谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

单元测试用于测试...单位。它们并不意味着测试您的程序的细节private内部工作。他们打算测试您所在类的面向public的API。

如果您的类的公共方法有效,那么您知道它们依赖的任何private机制也可以工作。如果private机制中断,他们将导致公共方法停止工作。

答案 1 :(得分:2)

通常,仅测试这段代码并不高效。 虽然我不同意你得到的另一个答案:不测试私有,测试应该对行为有意义。

当然,你可以为那里的每个成员编写单元测试,重构任何类型的主要PIB。这会有效吗?并不是的。

但是,对于它的价值,你只需要更多的反思魔法和瞧瞧:

    [TestMethod]
    public void PrivateListCanHaveObjectsAdded()
    {
      var target = new A();

      var b = typeof(A).GetNestedType("B", BindingFlags.NonPublic);
      var list = typeof(A).GetField("list", BindingFlags.Instance | BindingFlags.NonPublic);

      var bInstance = Activator.CreateInstance(b);
      var addMethod = typeof(List<>).MakeGenericType(b).GetMethod("Add");
      var countProperty = typeof(List<>).MakeGenericType(b).GetProperty("Count");
      addMethod.Invoke(list.GetValue(target), new object[] { bInstance });

      Assert.AreEqual(1, countProperty.GetValue(list.GetValue(target)));
    }