2012-05-07 13 views
14

Tengo una solución de Visual Studio con un proyecto C# dll. Esta solución también tiene un proyecto de prueba que hace referencia al resultado del proyecto C# dll. El dll del proyecto al que se hace referencia ha establecido Copiar local = verdadero.¿Por qué MSTest no copia las bibliotecas de proyectos referenciadas?

Si ejecuto esta prueba desde Visual Studio, funciona bien.

Pero si lo ejecuto desde la tarea MSBuild, por alguna razón MSTest no copia el dll C# referenciado a la carpeta de trabajo MSTest, por lo que la prueba falla. Lo extraño es que todas las demás bibliotecas referenciadas se copian en la carpeta de trabajo MSTest. Y si pongo un

[DeploymentItem(@"PleaseCopyThis.dll")] 

antes de mi método de ensayo, por último, se copia en la carpeta de trabajo MSTest y mi prueba funciona muy bien.

Pero, ¿por qué Visual Studio copia solo los dlls a los que se hace referencia que no son parte de la solución, pero no copia los dlls del proyecto al que se hace referencia?

+0

¿Alguna vez encontrar una solución para esto? – amaters

+1

No, acabo de salir de esa prueba en particular con DeploymentItem. Tal vez había algo mal con ese proyecto de prueba, se importó a VS 2010 desde VS 2008. – JustAMartin

+0

He tenido exactamente el mismo problema. Cargamos muchos dll dinámicamente y ninguno de ellos se copia al ejecutar MSTest. La mejor solución que he visto es simplemente agregarlos como un elemento de implementación. –

Respuesta

14

así que he encontrado este artículo: https://web-beta.archive.org/web/20140803214948/http://www.dotnetthoughts.net:80/mstest-exe-does-not-deploy-all-items/

Parece un problema mstest.

Porque tuve el mismo problema, pensé en una forma de solucionarlo. En mi caso, los dll referenciados nunca se usaron directamente desde el proyecto de prueba (aunque se usaron mediante el uso de la reflexión). para resolverlo he añadido un testclass con el siguiente código:

[AssemblyInitialize] 
    public static void InitializeReferencedAssemblies(TestContext context) 
    { 
     ObjectInAssemblyX dummy = new ObjectInAssemblyX(); 
     ObjectInAssemblyY dummy2 = new ObjectInAssemblyY(); 
    } 

Ahora que se utilizan por lo que se copiarán

+0

¿Qué beneficio tiene eso sobre el uso del OP de DeploymentItemAttribute? –

+0

@Stafford Williams Debe definir deploymentitemattribute en cada método. Esta es la razón por la que solo tiene que crear una instancia para toda la asamblea. – Fabian

+2

@Fabian no, no, solo puede tenerlo por encima de una declaración de clase y el elemento se copiará –

Cuestiones relacionadas