2012-07-24 53 views
6

基本的に、私のテストのいくつかは成功していますが、失敗しているものもあります。 Mr. Skeetの優れた提案では、私は夢中ではないことを確認するための完全なコードサンプルを作成しました。これはコードです:System.MissingMethodExceptionに実行中:PrivateObjectで見つからないメソッド

namespace ClassLibrary 
{ 
    using System; 

    public class Manager 
    { 
     private int SampleMethod(int id) 
     { 
      return id; 
     } 
    } 
} 

私のテストは、次のとおりです。

namespace UnitTestProject 
{ 
    using System; 
    using Microsoft.VisualStudio.TestTools.UnitTesting; 

    [TestClass] 
    public class UnitTest 
    { 
     [TestMethod] 
     public void TestPasses() 
     { 
      var privateInfo = new PrivateObject(new ClassLibrary.Manager()); 
      var actual = privateInfo.Invoke("SampleMethod", 1); 
     } 

     [TestMethod] 
     public void TestErrorsOut() 
     { 
      var privateInfo = new PrivateObject(new ClassLibrary.Manager()); 
      var actual = privateInfo.Invoke("SampleMethod", 0); 
     } 

     [TestMethod] 
     public void TestWorksAsWell() 
     { 
      var privateInfo = new PrivateObject(new ClassLibrary.Manager()); 
      privateInfo.Invoke("SampleMethod", new object[] { 0 }); 
     } 

     [TestMethod] 
     public void TestAlsoErrorsOut() 
     { 
      var privateInfo = new PrivateObject(new ClassLibrary.Manager()); 
      var types = new Type[] { typeof(int) }; 
      var actual = privateInfo.Invoke("SampleMethod", types, 0); 
     } 
    } 
} 

最初のテスト(TestPasses())作品。

第二の試験(TestErrorsOut())は以下のエラーで失敗: {「メソッド 『ClassLibrary.Manager.SampleMethod』が見つかりません」}

不可解なことは、エラーが一貫しているが、実際のテストはほぼ同じです。意味がない。私はVS2012 RCとVS2010で同じ結果を試しました。

私が考えることができるのは、 "0"がint以外のものとしてキャストされていることだけです。つまり、SampleMethodのメソッドシグネチャを見つけることができません。私は、私が探している型(TestAlsoErrorsOut())を明示的に渡すために3番目のテストを試みましたが、同じエラーでエラーも出てきました。

アイデア?ありがとう。

編集OBJ代わりのparams OBJ []オーバーロードの[]、それは(テストTestWorksAsWell())に機能を使用してのイアンの提案を使用することにより

を追加します。そして、それはなぜ私がタイプ[]で動作しないparamsメソッドを使用しているので、TestAlsoErrorsOut()が失敗する理由を説明します。したがって、これは修正されています。しかし、なぜ? params obj []は1を渡すときになぜ機能しますか?0ではなく?

+3

あなたは、問題を実証するために短いが、完全なプログラムを表示することができますか?それはlのための1のタイプミスですか? –

+0

なぜプライベートメソッドを単体テストしたいのですか? – Anuraj

+1

@Anuraj - 私はなぜこの記事を引用していますが、これについて議論するフォーラムではないと思います。 http://www.codeproject.com/Articles/9715/How-to-Test-Private-and-Protected-methods-in-NET。 – bryanjonker

答えて

9

ドキュメント(http://msdn.microsoft.com/en-us/library/ms243710.aspx)によれば、引数はオブジェクトの配列として渡されるものとします。明示的にオブジェクトの配列を渡すと、正しく動作しているように見えます:

var actual = (int)privateInfo.Invoke("SampleMethod", new object[] {0}); 

この過負荷

Invoke(string name = "SampleMethod", System.Reflection.BindingFlags bindingFlags = Default, object[] args = {object[0]}) 
+0

私の場合、私はそれをvarとして与えていましたinputObj = new Object [2];私はちょうど1つの入力パラメータを渡していましたが.. varに変更するinputObj = new Object [1];私の問題を解決した – Ziggler

0

を選択するコンパイラをもたらすために、独自の現れに0を渡すと、次のテストを呼び出すときに、私はSystem.MissingMethodExceptionを得ていました:ターゲットのプライベートメソッドのシグネチャで

PrivateObject shadow = new PrivateObject(target);  
shadow.Invoke("PrivateMethod", new string[]{"arg1","arg2"}); 

private void PrivateMethod(string[] args) 

私は次のように例外を解決するために、プライベートメソッドのシグネチャにのparamsを追加する必要がありました:

private void PrivateMethod(params string[] args) 
関連する問題