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

そのようなクラスを手動で書くことはできますが、それを自動的に行う方法があるのではないかと思います。VS2012のプロフェッショナルバージョンを持っています。

4

3 に答える 3

1

このために.NETに組み込まれているものは何も知りませんが、 。を使用して、そのようなすべてのクラスに対して1回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では、メソッド/コンストラクターを右クリックして、[テストの生成]を選択するだけです。これにより、外部クラスのAccessorクラスが作成され、プライベート内部クラスにアクセスできるようになります。

于 2013-01-10T13:09:41.833 に答える