c# - test - Cómo ejecutar NUnit mediante programación
unit test c# ejemplo (2)
"¿Cuál es el secreto para hacer 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 ensamblaje desde un archivo, use:
Assembly a = System.Reflection.Assembly.LoadFrom(pathToFileOnDisk);
(LoadFrom realmente usa Assembly.Load internamente)
Por cierto, ¿hay alguna razón por la que no se puede usar la herramienta de línea de comandos NUnit-Console y simplemente pasarle la ruta a su 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?
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.
Hasta ahora tengo:
var runner = new SimpleTestRunner();
runner.Load(path);
var result = runner.Run(NullListener.NULL);
Sin embargo, al llamar a runner.Load (ruta) arroja 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 manualmente este tipo, pero nunca se llama a mi controlador.
¿Cuál es el secreto para hacer que Assembly.Load (...) funcione?
Si desea abrir en modo consola , agregue la referencia nunit-console-runner.dll y use:
NUnit.ConsoleRunner.Runner.Main(new string[]
{
System.Reflection.Assembly.GetExecutingAssembly().Location,
});
Si desea abrir en modo GUI , agregue la referencia nunit-gui-runner.dll y use:
NUnit.Gui.AppEntry.Main(new string[]
{
System.Reflection.Assembly.GetExecutingAssembly().Location,
"/run"
});
Este es el mejor enfoque porque no tiene que especificar ninguna ruta.
Otra opción es también integrar el corredor de NUnit en la salida del depurador de Visual Studio:
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(); }
}
};
}