2012-07-24 4 views
6

Grundsätzlich sind einige meiner Tests erfolgreich, einige sind fehlgeschlagen. Per Mr. Skeets hervorragendem Vorschlag habe ich ein vollständiges Codebeispiel erstellt, um zu bestätigen, dass ich nicht verrückt bin. Dies ist der Code:In System.MissingMethodException ausgeführt: Methode nicht gefunden mit PrivateObject

namespace ClassLibrary 
{ 
    using System; 

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

Mein Test ist:

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

Der erste Test (TestPasses()) arbeitet.

Der zweite Test (TestErrorsOut()) schlägt mit dem folgenden Fehler: { „Die Methode‚ClassLibrary.Manager.SampleMethod‘nicht gefunden“}

Die verwirrende Sache ist der Fehler konsistent ist, aber die tatsächliche Test ist fast identisch. Das macht keinen Sinn. Ich habe dies auf VS2012 RC und VS2010 versucht, mit den gleichen Ergebnissen.

Das einzige, was ich mir vorstellen kann, ist "0" wird als etwas neben int geworfen, was bedeutet, dass es die Methodensignatur von SampleMethod nicht finden kann? Ich habe einen dritten Test ausprobiert, um den gesuchten Typ (TestAlsoErrorsOut()) explizit zu übergeben, aber auch mit dem gleichen Fehler.

Ideen? Vielen Dank.

bearbeiten

Durch die Verwendung von Ians Vorschlag zur Verwendung des obj [] anstelle von params obj [] Überlast an, es funktioniert (Test TestWorksAsWell()). Und das erklärt, warum TestAlsoErrorsOut() fehlschlägt, weil ich die params-Methode verwende, die mit Type [] nicht funktionieren würde. Also, das ist behoben. Aber warum? Warum funktioniert params obj [], wenn eine 1 übergeben wird, aber keine 0?

+3

zeigen Sie ein kurzes, aber vollständiges Programm, das Problem zu demonstrieren? Ist es ein Tippfehler von 1 oder so? –

+0

Warum möchten Sie eine private Methode testen? – Anuraj

+1

@Anuraj - Ich verweise auf diesen Artikel auf "warum", aber ich denke nicht, dass dies das Forum ist, um darüber zu diskutieren. http://www.codeproject.com/Articles/9715/How-to-Test-Private-and-Protected-Methods-in-NET. – bryanjonker

Antwort

9

Gemäß der Dokumentation (http://msdn.microsoft.com/en-us/library/ms243710.aspx) sollen die Argumente als Array von Objekten übergeben werden. ein Objekt-Array Explizit vorbei scheint korrekt zu funktionieren:

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

Passing 0 auf seinem eigenen erscheint im Compiler führen diese Überladung Auswahl

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

In meinem Fall gab ich es als var inputObj = neues Objekt [2]; obwohl ich nur einen Eingabeparameter übergeben habe .. zu var wechseln inputObj = new Object [1]; löste mein Problem – Ziggler

0

ich die System.MissingMethodException bekommen, wenn Sie den folgenden Test Aufruf :

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

auf dem privaten Methode Signatur des Ziels

private void PrivateMethod(string[] args) 

Ich hatte params auf die private Methode Signatur hinzuzufügen, um die Ausnahme wie folgt zu beschließen:

private void PrivateMethod(params string[] args) 
Verwandte Themen