6

コードを開発するとき、通常はプライベートであっても、クラスの構成要素の一部を単体テストしたいことがよくあります。単体テストがプロジェクト内にある場合、「Friend」を使用してこれを達成し、通常の使用のために関数をプライベートに保つことができます。しかし、NUnit テストを独自の別のプロジェクトに移動したいと考えています。求めている効果を得るにはどうすればよいですか?

4

3 に答える 3

11

別のプロジェクトのプライベートメソッドを (簡単に) テストすることはできませんがFriendInternalsVisibleToAttribute. これにより、Friendメンバーは別のアセンブリにアクセスできるようになります。

どうやらこれは VB 9 の新機能でしたが、C# 2 では利用可能でした...理由はよくわかりませんが、Bart de Smet のこのブログ投稿で簡単な例を示しています。

運用アセンブリが署名されている場合は、テスト アセンブリも署名する必要があり、InternalsVisibleToAttribute引数で公開キーを指定する必要があることに注意してください。詳細については、このスタック オーバーフローの回答を参照してください。

于 2009-03-15T21:33:08.070 に答える
3

Reflection を使用してプライベート メソッドを呼び出すことができます。これを行うためのサンプルがたくさんあります。

于 2009-03-15T22:03:48.260 に答える
1

簡単な Google 検索から: http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx

基本: (これは上記のコード プロジェクト サイトから貼り付けたものです)

        public static object RunStaticMethod(System.Type t, string strMethod,
  object []  objParams) 
    {
        BindingFlags eFlags = 
         BindingFlags.Static | BindingFlags.Public | 
         BindingFlags.NonPublic;
        return RunMethod(t, strMethod, 
         null, aobjParams, eFlags);
    } //end of method

    public static object RunInstanceMethod(System.Type t, string strMethod, 
     object objInstance, object [] aobjParams) 
    {
        BindingFlags eFlags = BindingFlags.Instance | BindingFlags.Public | 
         BindingFlags.NonPublic;
        return RunMethod(t, strMethod, 
         objInstance, aobjParams, eFlags);
    } //end of method

    private static object RunMethod(System.Type t, string 
     strMethod, object objInstance, object [] aobjParams, BindingFlags eFlags) 
    {
        MethodInfo m;
        try 
        {
            m = t.GetMethod(strMethod, eFlags);
            if (m == null)
            {
                 throw new ArgumentException("There is no method '" + 
                  strMethod + "' for type '" + t.ToString() + "'.");
            }

            object objRet = m.Invoke(objInstance, aobjParams);
            return objRet;
        }
        catch
        {
            throw;
        }
    } //end of method
于 2009-04-17T17:20:07.370 に答える