2012-05-07 17 views
14

Ho una soluzione di Visual Studio con un progetto d # Cll. Questa soluzione ha anche un progetto di test che fa riferimento all'output del progetto C# dll. La dll di progetto referenziata ha impostato Copy Local = true.Perché MSTest non copia le librerie di progetto di riferimento?

Se eseguo questo test da Visual Studio, funziona correttamente.

Ma se lo eseguo dall'attività MSBuild, per qualche motivo MSTest non copia la DLL C# di riferimento nella cartella di lavoro MSTest, quindi il test ha esito negativo. La cosa strana è che tutte le altre librerie referenziate vengono copiate nella cartella di lavoro MSTest. E se metto un

[DeploymentItem(@"PleaseCopyThis.dll")] 

prima che il mio metodo di prova, infine, viene copiato il MSTest cartella di lavoro e il mio test funziona bene.

Ma perché Visual Studio copia solo le DLL di riferimento che non fanno parte della soluzione, ma non copia le DLL di progetto di riferimento?

+0

Hai mai trovato una soluzione per questo? – amaters

+1

No, ho appena lasciato quel particolare test con DeploymentItem. Forse c'era qualcosa di sbagliato in quel progetto di test, è stato importato in VS 2010 da VS 2008. – JustAMartin

+0

Ho avuto lo stesso identico problema. Carichiamo molte DLL dinamicamente e nessuna di esse viene copiata durante l'esecuzione di MSTest. La soluzione migliore che ho visto è aggiungerli come elemento di implementazione. –

risposta

14

così ho trovato questo articolo: https://web-beta.archive.org/web/20140803214948/http://www.dotnetthoughts.net:80/mstest-exe-does-not-deploy-all-items/

Sembra un problema mstest.

Perché ho appena avuto lo stesso problema ho trovato un modo per risolverlo. Nel mio caso la dll referenziata non è mai stata utilizzata direttamente dal testproject (anche se sono stati usati usando la reflection). per risolverlo ho aggiunto un testclass con il seguente codice:

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

Ora sono utilizzati in modo che verranno copiati

+0

Quali vantaggi ha sull'utilizzo di DeploymentItemAttribute da parte dell'OP? –

+0

@Stafford Williams È necessario definire deploymentitemattribute su ciascun metodo. Questo perché devi solo istanziarlo una volta per l'intero assemblaggio. – Fabian

+2

@Fabian no non lo fai, puoi semplicemente averlo sopra una dichiarazione di classe e l'oggetto verrà copiato –

Problemi correlati