2012-07-24 32 views
6

Básicamente, algunas de mis pruebas están teniendo éxito, algunas fallan. Según la excelente sugerencia del Sr. Skeet, creé una muestra de código completo para confirmar que no estoy loco. Este es el código:Ejecutando en System.MissingMethodException: Método no encontrado con PrivateObject

namespace ClassLibrary 
{ 
    using System; 

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

Mi prueba es:

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 primera prueba (TestPasses()) funciona.

La segunda prueba (TestErrorsOut()) falla con el siguiente error: { " 'ClassLibrary.Manager.SampleMethod' Método no encontrado"}

Lo desconcertante es el error es consistente, pero el real la prueba es casi idéntica. No tiene sentido. Intenté esto con VS2012 RC y VS2010, con los mismos resultados.

Lo único que se me ocurre es que "0" está siendo lanzado como algo además de int, lo que significa que no puede encontrar la firma del método de SampleMethod? Probé una tercera prueba para pasar explícitamente en el tipo que estoy buscando (TestAlsoErrorsOut()), pero eso también genera errores con el mismo error.

Ideas? Gracias.

Editar para añadir

Mediante el uso de la sugerencia de utilizar de Ian obj [] en lugar de params obj [] sobrecarga, funciona (prueba TestWorksAsWell()). Y eso explica por qué TestAlsoErrorsOut() falla, porque estoy usando el método params, que no funcionaría con Type []. Por lo tanto, esto es fijo. ¿Pero por qué? ¿Por qué los params obj [] funcionan al pasar un 1, pero no un 0?

+3

Se puede mostrar un programa corto pero completo para mostrar el problema? ¿Es un error tipográfico de 1 por l o algo así? –

+0

¿Por qué quiere probar la unidad de un método privado? – Anuraj

+1

@Anuraj - Me remito a este artículo sobre "por qué", pero no creo que este sea el foro para discutir eso. http://www.codeproject.com/Articles/9715/How-to-Test-Private-and-Protected-methods-in-NET. – bryanjonker

Respuesta

9

De acuerdo con los documentos (http://msdn.microsoft.com/en-us/library/ms243710.aspx), se supone que los argumentos se pasan como una matriz de objetos. pasando explícitamente una matriz de objetos parece funcionar correctamente:

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

Pasando 0 en sus propios parece dar como resultado el compilador seleccionar esta sobrecarga

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

En mi caso, lo estaba dando como var inputObj = new Object [2]; aunque estaba pasando solo un parámetro de entrada ... cambiando a var inputObj = new Object [1]; resuelto mi problema – Ziggler

0

que estaba recibiendo la System.MissingMethodException cuando se llama a la siguiente prueba :

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

En la firma método privado del objetivo

private void PrivateMethod(string[] args) 

he tenido que añadir params a la firma del método privado para resolver la excepción de la siguiente manera:

private void PrivateMethod(params string[] args) 
Cuestiones relacionadas