2009-03-15 17 views
5

私はコードを開発するので、クラスのビルディングブロックのいくつかを、通常はプライベートであるとしても、それらをユニットテストすることがしばしばあります。私のユニットテストがプロジェクトの中にある場合、私はこれを達成するために "Friend"を使うことができ、通常の使用のために関数を非公開にします。しかし、私はむしろ自分のNUnitテストを別のプロジェクトに移したいと思う。私が探している効果をどのように達成するのですか?あなたは(簡単に)テストのテストプロジェクトからプライベート別のプロジェクトからの方法が、それは内部メソッドをテストするのは非常に一般的です(VBでFriend)がInternalsVisibleToAttributeを使用することはできませんVB .NETで個別のプロジェクトからプライベート関数をテストするにはどうすればよいですか?

答えて

11

。これにより、Friendのメンバーは別のアセンブリからアクセスできます。

これはVB 9で新しくなったようですが、C#2で利用可能でしたが...確かに理由はわかりませんが、this blog post from Bart de Smetは簡単な例です。

プロダクションアセンブリが署名されている場合は、テストアセンブリにもサインする必要があるので、InternalsVisibleToAttribute引数に公開鍵を指定する必要があります。詳細はthis Stack Overflow answerを参照してください。

+2

(これは、上記のリンクされたコードのプロジェクトのサイトから貼り付けている)、それがあったコスト/利益のトレードオフ。 VBはC#やInternalsVisibleToよりも名前解決の方法が非常に異なり、名前の検索が非常に複雑です。 VB8ではコストが高すぎてVB9に落ちました。私たちは実際にVB10で(cont) – JaredPar

+0

(cont)アカウントの名前解決についてさらに変更を加えています。 – JaredPar

+0

この回答に感謝します –

3

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

+0

これは私を最も助けてくれたものです:http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx – demoncodemonkey

1

http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx

基礎:それはVB9で追加された理由として

 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 
関連する問題