我正在使用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(...)的结果。
Tool_Accessor.Result - 将是嵌套类的访问器。
最常见的方法是测试类的公共契约,并避免测试私有契约,因为它使测试更容易受到实际实现中更改的影响。尝试设计您的 API,避免测试私有方法。当需要测试私有方法时,在这种情况下,类可能会破坏单一责任原则。
例如,XML 序列化。当在表示域业务对象的类中进行 XML 序列化时,尤其是使用继承时,当域对象之间存在层次结构时。在这种情况下,很难使用内部的 XML 序列化实现来测试此类域对象。但是当在域对象之外实现XML序列化时,比域对象和具有XML序列化逻辑的对象都可以使用公共协定轻松测试。
有时很难避免测试私有方法。在 .NET 上下文中,可以使此类方法作为内部方法访问,并使用 InternalsVisibleTo 属性从测试访问它。