2012-07-24 7 views
6

Zasadniczo niektóre z moich testów się powiodły, niektóre nie. Zgodnie z doskonałą sugestią pana Skeeta, stworzyłem pełną próbkę kodu, aby potwierdzić, że nie jestem szalona. Jest to kod:Uruchomiony do System.MissingMethodException: Metoda nie znaleziona z PrivateObject

namespace ClassLibrary 
{ 
    using System; 

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

Mój test jest:

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

Pierwszy test (TestPasses()) działa.

Drugi test (TestErrorsOut()) nie powiedzie się z powodu następującego błędu: { „Metoda«ClassLibrary.Manager.SampleMethod»nie znaleziono”}

zaskakujące jest to błąd jest spójny, ale rzeczywista test jest prawie identyczny. To nie ma sensu. Próbowałem tego na VS2012 RC i VS2010, z tymi samymi wynikami.

Jedyne, co mogę wymyślić to "0" to rzucanie jako czegoś poza int, co oznacza, że ​​nie może znaleźć sygnatury metody SampleMethod? Próbowałem trzeciego testu, aby jawnie przekazać typ, którego szukam (TestAlsoErrorsOut()), ale to również powoduje błędy z tym samym błędem.

Pomysły? Dzięki.

Edytuj, aby dodać

Korzystając sugestię Iana z wykorzystaniem obj [] zamiast params OBJ [] przeciążenie, to działa (test TestWorksAsWell()). I to wyjaśnia, dlaczego TestAlsoErrorsOut() nie działa, ponieważ używam metody params, która nie działałaby z Type []. Naprawiono to. Ale dlaczego? Dlaczego params obj [] działają przy przekazywaniu 1, ale nie 0?

+3

można pokazać krótki, ale kompletny program do wykazania problem? Czy jest to literówka 1 dla l, czy coś w tym stylu? –

+0

Dlaczego chcesz przetestować metodę prywatną? – Anuraj

+1

@Anuraj - Odkładam ten artykuł na temat "dlaczego", ale nie sądzę, że to jest forum do dyskusji. http://www.codeproject.com/Articles/9715/How-to-Test-Private-and-Protected-methods-in-NET. – bryanjonker

Odpowiedz

9

Zgodnie z dokumentami (http://msdn.microsoft.com/en-us/library/ms243710.aspx) argumenty mają być przekazywane jako tablica obiektów. Jawne przekazywanie tablicy obiektów wydaje się działać poprawnie:

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

Przechodząc 0 własnymi pojawia się na skutkować kompilatora wybraniu tej przeciążenie

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

W moim przypadku podawałem go jako var inputObj = new Object [2]; mimo że przechodziłem tylko jeden parametr wejściowy .. zmieniając na var inputObj = new Object [1]; rozwiązałem mój problem – Ziggler

0

byłem coraz System.MissingMethodException podczas wywoływania następujący test :

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

Na prywatnej podpisania metoda docelowego

private void PrivateMethod(string[] args) 

musiałem dodać params do prywatnego podpisu metody rozwiązywania wyjątku następująco:

private void PrivateMethod(params string[] args) 
Powiązane problemy