我正在将MS Test与私有访问器结合使用来对我的类进行单元测试。我很好地使用私有访问器(在VS 2012中不可用:-()来调用我的私有方法。这很好。
但我无法访问私有嵌套类!
例如:
public class Tool
{
private IList<Result> DoSomePreparation(object anything)
{
// do some preparations here
}
private class Result { }
}
通过私人访问者,可以访问我的私人方法
{
var accessor = new Tool_Accessor(new PrivateObject(new Tool()));
accessor.DoSomePreparation(new object());
}
但是如何访问嵌套类呢? 我需要它,因为我想模拟来自DoSomePreparation(...)的结果。
答案 0 :(得分:1)
Tool_Accessor.Result - 将成为嵌套类的访问者。
答案 1 :(得分:1)
在这种情况下,最常见的方法是测试类的公共合同,并避免测试私有,因为它使测试对实际实现中的更改更加脆弱。尝试设计您的API,避免测试私有方法。在测试所需的私有方法时,在这种情况下,类可以打破单一责任原则。
例如,XML序列化。当在表示域业务对象的类内部进行XML序列化时,尤其是在继承时,在域对象之间存在层次结构时。在这种情况下,很难用XML序列化实现来测试这样的域对象。但是当在域对象之外实现XML序列化时,使用公共契约可以轻松地测试具有XML序列化逻辑的域对象和对象。
有时很难避免测试私有方法。在.NET的上下文中,您可以使这些方法可以作为内部访问,并使用InternalsVisibleTo属性从测试中访问它。