我遇到了以下问题。假设有一个包含私有类的类,必须进行测试。为了切断不必要的评论和答案,是它必须保密,是,必须进行测试。
说,看起来像这样:
public class PublicClass
{
private class InternalClass
{
void Method() { }
}
}
为了方便测试,我想创建以下类:
public class InternalClassAccess
{
private object instance;
public InternalClassAccess()
{
// Use reflections to instantiate InternalClass
// and store it in instance field
}
public void Method()
{
// Use reflections to call Method() on
// stored instance
}
}
我可以手动编写这样的类,但我想知道,如果有某种自动方式这样做?我有VS 2012的专业版。
答案 0 :(得分:1)
我不知道.NET内置的任何内容 - 但您可以使用dynamic
为所有类别编写一次类。你有这样的结构:
public class PrivateDynamicAccessor : DynamicObject
{
private readonly object instance;
public PrivateDynamicAccessor(string typeName)
{
// Instantiate here via reflection
}
public override bool TryGetMember(GetMemberBinder binder,
out Object result)
{
// Access the fields or properties with reflection
}
}
(同样TryInvokeMember
用于方法等)
然后您可以将其用作:
dynamic foo = new PrivateDynamicAccessor("Foo.Bar+Baz");
string name = foo.Name;
// etc
(我同意这样的评论,认为你必须做到这一点很奇怪。请注意。你真的不能让它成为内部的吗?)
答案 1 :(得分:1)
您可以使用一些预处理指令:
public class PublicClass
{
#if DEBUG
public class InternalClass
#else
private class InternalClass
#endif
{
void Method() { }
}
}
//Only valid when testing in Debug
public class TestableInternalClass : PublicClass.InternalClass
{
}
答案 2 :(得分:0)
在Visual Studio 2010 Ultimate中,您只需右键单击方法/构造函数并选择生成测试。这将为外部类创建一个Accessor类,允许您访问私有内部类。