单元测试——在c#中自动生成访问器类的方法

本文关键字:方法 访问 自动生成 单元测试 | 更新日期: 2023-09-27 17:51:16

我有以下问题。假设有一个类,其中包含一个必须测试的私有类。为了切断不必要的注释和答案,yes必须保持私有,yes必须进行测试。

就像这样:

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

单元测试——在c#中自动生成访问器类的方法

我不知道。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
我同意这个评论,提醒你,必须这样做是奇怪的。你真的不能放在内部吗?)

你可以使用一些预处理指令:

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
{
}

在Visual Studio 2010 Ultimate中,您可以右键单击方法/构造函数并选择generate test。这将为外部类创建一个Accessor类,允许您访问私有内部类。