2012-07-24 25 views
6

基本上,我的一些測試成功,有些失敗。根據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()),但是也出現了錯誤。

想法?謝謝。

編輯補充

通過使用使用的伊恩的建議與obj []而不是PARAMS OBJ []過載,它的工作原理(測試TestWorksAsWell())。這就解釋了爲什麼TestAlsoErrorsOut()失敗,因爲我使用了params方法,這不適用於Type []。所以,這是固定的。但爲什麼?爲什麼params obj []在傳遞1而不是0時工作?

+3

你能告訴一個簡短而完整的程序來演示這個問題?對於l或類似的東西是否是1的錯字? – 2012-07-24 23:43:16

+0

爲什麼你想單元測試一個私有方法? – Anuraj 2012-07-25 11:03:28

+1

@Anuraj - 我接受這篇關於「爲什麼」的文章,但我不認爲這是討論這個問題的論壇。 http://www.codeproject.com/Articles/9715/How-to-Test-Private-and-Protected-methods-in-NET。 – bryanjonker 2012-07-25 11:20:26

回答

9

根據文檔(http://msdn.microsoft.com/en-us/library/ms243710.aspx),參數應該作爲一個對象數組傳遞。明確地傳遞對象陣列看起來正常工作:

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

傳遞自身出現0到導致編譯器選擇該過載

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

在我的情況下,我把它作爲var inputObj = new Object [2];事實上,我只傳遞一個輸入參數..更改爲var inputObj = new Object [1];解決了我的問題 – Ziggler 2016-04-29 18:01:10

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) 
相關問題