在C#中自动生成访问器类的方法

时间:2013-01-10 13:04:00

标签: c# unit-testing class private

我遇到了以下问题。假设有一个包含私有类的类,必须进行测试。为了切断不必要的评论和答案,它必须保密,,必须进行测试。

说,看起来像这样:

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的专业版。

3 个答案:

答案 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类,允许您访问私有内部类。