Resharper ejecuta UnitTest desde diferentes ubicaciones

Cuando ejecuto pruebas unitarias con Visual Studio, funciona bien, ya que se ejecuta desde el directorio del proyecto donde están todos los ensamblados. Pero cuando lo ejecuto con resharper va con error en

var services = Assembly.Load("SomeAssembly"); 

con error

No se pudo cargar el archivo o ensamblado ‘SomeAssembly’ o una de sus dependencias. El sistema no puede encontrar el archivo especificado..

Así que lo he intentado

 var path = Assembly.GetExecutingAssembly().Location; 

y no es el proyecto uno. Sus

C: \ Users \ * UserName * \ AppData \ Local \ Temp \ TestResults \ … \ Out \

y no hay ‘SomeAssembly’ . ¿Cómo configuro resharper correctamente o recojo todos los ensamblajes como lo hace Visual Studio?

Ocurre con pruebas unitarias pero no con NUnit, ¿alguna idea?

Resharper duplica los ensamblajes para probarlos de manera predeterminada. Si desactiva la copia sombra, se ejecutará en la carpeta bin y la prueba debería pasar. Aquí hay algunas instrucciones para apagarlo.

En la documentación para la configuración del Gui Test Runner de NUnit tiene la siguiente nota sobre Shadow Copy

Nota: Si tiene la tentación de desactivar la copia oculta para acceder a archivos en el mismo directorio que su ensamblaje, debe tener en cuenta que existen alternativas. Considere usar la propiedad Assembly.Codebase en lugar de Assembly.Location.

Aquí hay un ejemplo del uso de la propiedad Assembly.Codebase

  private string AssemblyLocation() { var assembly = Assembly.GetExecutingAssembly(); var codebase = new Uri(assembly.CodeBase); var path = codebase.LocalPath; return path; } 

Tuve el mismo problema, el corrector de prueba de resharper estaba en C: \ mientras que los dlls y la solución reales estaban en otra unidad. La solución fue desmarcar “Usar Legacy Runner” en la página de configuración de MSTest en las opciones de reafilado.

Intente crear un archivo de ajustes de prueba y configure reglas de implementación para sus pruebas .

Las versiones anteriores de reafilamiento parecen tener algunos errores al procesar la distribución de las carpetas , creo que está corregido en la última versión de resharper 7 .

Pruebe este código para cargarlo (vea abajo). Buscará ensamblados independientes del corredor de prueba.

 private static string[] assemblyLookupPath = new[] { AppDomain.CurrentDomain.BaseDirectory, Environment.CurrentDirectory, Assembly.GetExecutingAssembly().Location }.Distinct().ToArray(); public static void Assembly Load(string fileName) { var filePath = assemblyLookupPath .Select(f=>Path.Combine(f, fileName)) .Where(File.Exists) .FirstOrDefault(); /*do here null checks and raise errors, write logs, etc*/ return Assembly.LoadFrom(filePath ) } 

Está cargando sus ensamblajes dinámicamente utilizando Assembly.Load() . Puede ser que le falta una referencia al ensamblaje para cargar. De lo contrario, la copia oculta puede omitir los ensamblajes sin referencia.

Si no desea hacer referencia a estos conjuntos, asegúrese de incluirlos en su proyecto y copiarlos en el directorio de salida. Puede hacerlo configurando la propiedad ” Copiar en el directorio de salida ” o creando un paso personalizado de creación posterior.

Solo para completar la respuesta muy útil de mcdon , usando assembly.Location da la respuesta correcta según la explicación de MSFT :

CodeBase es una URL al lugar donde se encontró el archivo, mientras que la ubicación es la ruta desde donde se cargó realmente. Por ejemplo, si el ensamblado se descargó de Internet, su CodeBase puede comenzar con “http: //”, pero su ubicación puede comenzar con “C: \”. Si el archivo fue copiado en la sombra, la ubicación sería la ruta a la copia del archivo en el directorio shadow-copy.

También es bueno saber que no se garantiza que CodeBase esté configurado para ensamblajes en el GAC. Sin embargo, siempre se establecerá la ubicación para los ensamblados cargados desde el disco.

Por lo tanto, usaría lo siguiente:

 public static DirectoryInfo GetAssemblyDirectory() { var assembly = Assembly.GetExecutingAssembly(); return new DirectoryInfo(Path.GetDirectoryName(assembly.Location)); } 

Solo cambia el directorio actual

 var dir = Path.GetDirectoryName(typeof(MySetUpClass).Assembly.Location); Environment.CurrentDirectory = dir; // or Directory.SetCurrentDirectory(dir); 

https://github.com/nunit/nunit/issues/1072

Lo que me solucionó fue establecer la propiedad “Copiar local” en true en la referencia nunit.framework.dll en el proyecto de prueba.

Si ha ejecutado y generado un problema después de deshabilitar la “construcción oculta”, primero debe elegir la opción “Limpiar todo” de la comstackción y luego crear su proyecto en la “creación oculta”.