大家。我现在正在进行单元测试,而我有一个问题,我无法自己解决。 问题列在下面:
public class A {
private class B{ }
private List<B> list = new List<B>;
}
我想测试list[i]
是否null
?现在我可以使用Reflection来获取列表,但问题是如何在列表中添加B
的实例?
谢谢你的帮助!
答案 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)));
}