2012-07-24 10 views
6

Fondamentalmente, alcuni dei miei test hanno esito positivo, alcuni falliscono. Per l'eccellente suggerimento di Mr. Skeet, ho creato un codice completo per confermare che non sono pazzo. Questo è il codice:in esecuzione in System.MissingMethodException: metodo non trovato con PrivateObject

namespace ClassLibrary 
{ 
    using System; 

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

La mia prova è:

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

La prima prova (TestPasses()) funziona.

La seconda prova (TestErrorsOut()) non riesce con il seguente errore: { "Metodo 'ClassLibrary.Manager.SampleMethod' non trovato"}

La cosa sconcertante è l'errore è costante, ma l'attuale il test è quasi identico. Non ha senso. Ho provato questo su VS2012 RC e VS2010, con gli stessi risultati.

L'unica cosa a cui posso pensare è che "0" viene interpretato come qualcosa oltre a int, il che significa che non riesce a trovare la firma del metodo di SampleMethod? Ho provato un terzo test per passare in modo esplicito nel tipo che sto cercando (TestAlsoErrorsOut()), ma anche errori con lo stesso errore.

Idee? Grazie.

Modifica per aggiungere

Utilizzando il suggerimento di Ian di utilizzare il obj [] invece di params obj [] di sovraccarico, funziona (test TestWorksAsWell()). E questo spiega perché TestAlsoErrorsOut() fallisce, perché sto usando il metodo params, che non funzionerebbe con Type []. Quindi, questo è risolto. Ma perché? Perché params obj [] funziona quando si passa a 1, ma non a 0?

+3

Potete mostrare un programma breve ma completo per dimostrare il problema? È un errore di battitura di 1 per 1 o qualcosa del genere? –

+0

Perché vuoi testare un metodo privato? – Anuraj

+1

@Anuraj - Mi riferisco a questo articolo su "perché", ma non penso che questo sia il forum per discuterne. http://www.codeproject.com/Articles/9715/How-to-Test-Private-and-Protected-methods-in-NET. – bryanjonker

risposta

9

Secondo i documenti (http://msdn.microsoft.com/en-us/library/ms243710.aspx), si suppone che gli argomenti siano passati come una matrice di oggetti. Esplicitamente passando una matrice di oggetti sembra funzionare correttamente:

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

Passando 0 sui propri sembra essere il risultato nel compilatore selezionando questo sovraccarico

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

Nel mio caso lo stavo dando come var inputObj = new Object [2]; anche se stavo passando un solo parametro di input .. cambiando in var inputObj = new Object [1]; risolto il mio problema – Ziggler

0

mi è stato sempre lo System.MissingMethodException quando si chiama il seguente test :

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

Sulla firma metodo privato del bersaglio

private void PrivateMethod(string[] args) 

ho dovuto aggiungere params alla firma metodo privato per risolvere l'eccezione come segue:

private void PrivateMethod(params string[] args) 
Problemi correlati