2008-10-12 19 views
16

Tengo un ensamblado que hace referencia a NUnit y crea una única clase de prueba con un único método de prueba. Puedo obtener la ruta del sistema de archivos a este ensamblado (por ejemplo, "C: ... \ test.dll"). Me gustaría usar programáticamente NUnit para ejecutar contra este ensamblado.Cómo ejecutar NUnit mediante programación

hasta ahora tengo:

var runner = new SimpleTestRunner(); 
runner.Load(path); 
var result = runner.Run(NullListener.NULL); 

Sin embargo, llamando runner.Load (ruta) emitirá una excepción FileNotFound. Puedo ver a través del seguimiento de la pila que el problema es con NUnit llamando a Assembly.Load (ruta) por la pila. Si cambio la ruta de acceso a algo así como "Prueba, Versión = 1.0.0.0, Cultura = neutral, PublicKeyToken = null", entonces sigo recibiendo el mismo error.

He agregado un controlador de eventos a AppDomain.Current.AssemblyResolve para ver si puedo resolver este tipo manualmente, pero nunca se llama a mi controlador.

¿Cuál es el secreto para hacer que Assembly.Load (...) funcione?

+0

Al final, mi solución era sólo tiene que utilizar XUnit. NUnit es un poco rudo. –

Respuesta

29

Si desea abrir en un modo de consola , añadir nunit-consola-runner.dll referencia y uso:

NUnit.ConsoleRunner.Runner.Main(new string[] 
    { 
     System.Reflection.Assembly.GetExecutingAssembly().Location, 
    }); 

Si desea abrir en un modo de interfaz gráfica de usuario , añadir nunit-GUI-runner.dll referencia y uso:

NUnit.Gui.AppEntry.Main(new string[] 
    { 
     System.Reflection.Assembly.GetExecutingAssembly().Location, 
     "/run" 
    }); 

Este es el mejor enfoque, ya que no hav e para especificar cualquier camino.

Otra opción es también para integrar corredor NUnit en la producción de Visual Studio depurador:

public static void Main() 
{ 
    var assembly = Assembly.GetExecutingAssembly().FullName; 
    new TextUI (new DebugTextWriter()).Execute(new[] { assembly, "-wait" }); 
} 

public class DebugTextWriter : StreamWriter 
{ 
    public DebugTextWriter() 
     : base(new DebugOutStream(), Encoding.Unicode, 1024) 
    { 
     this.AutoFlush = true; 
    } 

    class DebugOutStream : Stream 
    { 
     public override void Write(byte[] buffer, int offset, int count) 
     { 
      Debug.Write(Encoding.Unicode.GetString(buffer, offset, count)); 
     } 

     public override bool CanRead { get { return false; } } 
     public override bool CanSeek { get { return false; } } 
     public override bool CanWrite { get { return true; } } 
     public override void Flush() { Debug.Flush(); } 
     public override long Length { get { throw new InvalidOperationException(); } } 
     public override int Read(byte[] buffer, int offset, int count) { throw new InvalidOperationException(); } 
     public override long Seek(long offset, SeekOrigin origin) { throw new InvalidOperationException(); } 
     public override void SetLength(long value) { throw new InvalidOperationException(); } 
     public override long Position 
     { 
      get { throw new InvalidOperationException(); } 
      set { throw new InvalidOperationException(); } 
     } 
    }; 
} 
+0

Intenté este enfoque y me da una "Referencia de objeto no configurada para una instancia de un objeto". cuando llamas a Main. Tal vez se esperan diferentes argumentos ahora? – Justin

+2

Si está utilizando el modo gui & nunit-gui-runner.dll, no se olvide de marcar su func principal como [STAThread]. – Wes

+0

Acabo de hacer el segundo ejemplo, GUI. Tuve que cambiar '"/ejecutar "' a '" -run "'. Me estoy ejecutando en Debian Gnu/Linux. –

3

"¿Cuál es el secreto para que Assembly.Load funcione?"

System.Reflection.Assembly.Load toma una cadena que contiene un nombre de conjunto, no una ruta a un archivo.

Si desea cargar un ensamblado de una utilización archivo:

Assembly a = System.Reflection.Assembly.LoadFrom(pathToFileOnDisk); 

(LoadFrom utiliza realmente Assembly.Load internamente)

Por cierto, ¿hay alguna razón por la que puede; t uso el NUnit-Console command line tool y simplemente pásalo por el camino hacia tu ensamblaje de prueba? Entonces, podría simplemente usar System.Diagnostics.Process para ejecutar esto desde su aplicación cliente, ¿podría ser más simple?

+0

Bueno, me gustaría poder usar LoadFrom, pero desafortunadamente el Assembly.Load se llama desde NUnit no es mi código, así que no puedo controlarlo. –

+0

Probablemente necesite llamarlo a través de un proceso como el que sugiere ... Preferiría tener objetos para mis propios propósitos de visualización, pero debería ser lo suficientemente bueno como para usar un proceso por el momento. –

+0

¡No hay 'secretos' en la programación! –

Cuestiones relacionadas