1

我有以下问题。假设有一个类,其中包含一个必须测试的私有类。为了切断不必要的评论和答案,的,它必须保持私密,的,它必须经过测试。

说,它看起来像这样:

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。

4

3 回答 3

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

(我同意不得不这样做很奇怪的评论,请注意。你真的不能让它成为内部的吗?)

于 2013-01-10T13:13:12.303 回答
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
{

}
于 2013-01-10T13:19:12.337 回答
0

在 Visual Studio 2010 Ultimate 中,您只需右键单击方法/构造函数并选择生成测试。这将为外部类创建一个访问器类,允许您访问私有内部类。

于 2013-01-10T13:09:41.833 回答