2015-07-29 18 views
20

ho scoperto che uno dei miei test che passa VS2013 sta fallendo nel VS2015, il test chiama un servizio che comprende tra l'altro una chiamata a Console.Clear();"l'handle non valido" eccezione in Visual Studio 2015 prova corridore

per scoprire cosa sta succedendo ho fatto un semplice test di unità

[TestMethod] 
    public void ExampleTest() 
    { 
     Console.Clear(); 
    } 

Questo test passa in visual Studio 2013, ma nel 2015 ottengo il seguente errore:

Test Name: ExampleTest Test FullName: solution.Common.Test.CacheManagerTest.ExampleTest Test Source: C:\solution.Common.Test\CacheManagerTest.cs : line 34 Test Outcome: Failed Test Duration: 0:00:00.3015003

Result StackTrace: at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.Console.GetBufferInfo(Boolean throwOnNoConsole, Boolean& succeeded) at System.Console.Clear()
at sol.Common.Test.CacheManagerTest.ExampleTest() in C:\solution.Common.Test\CacheManagerTest.cs:line 35 Result Message:
Test method Alexandria.Common.Test.CacheManagerTest.ExampleTest threw exception: System.IO.IOException: The handle is invalid.

Capisco che sia un cattivo progetto per il mio servizio fallire se non viene chiamato da una console. Il motivo per cui sto facendo questa domanda è capire perché questo non funziona nella nuova versione di Visual Studio. È questo il comportamento previsto? Cosa è cambiato?

Non ho visto nulla di ovvio nel registro delle modifiche che sembrerebbe correlato a questo.

Edit: sto chiamando il Console.clear dal seguente dll

Microsoft\Framework.NETFramework\v4.5.1\mscorlib.dll

Edit 2:

foto di TestProject immobili a entrambi gli studi visivi both visual studios

+0

No. Per me questo non funziona su Visual Studio 2010. Puoi ricontrollare ** VS2013 ** Fare clic con il pulsante destro del mouse sul progetto, selezionare Proprietà -> Seleziona la scheda Applicazione -> Verifica il tipo di output. Si dice biblioteca di classe? – gideon

+0

@gideon si è una libreria di classi http://i.imgur.com/1Vedgyd.png Sto usando Microsoft Visual Studio Professional 2013 Versione 12.0.31101.00 Update 4 – mmilan

+0

Wow è piuttosto strano. Dovrebbe interrompersi, poiché non è disponibile la console quando si tratta di una libreria di classi. Funziona e cancella la console? – gideon

risposta

14

Le variazioni sono VS2015 abbastanza visibile, usa Test> Debug> Tutti i test per ottenere informazioni dettagliate. Si può vedere che ora ha un nuovo processo host di test, il suo nome è TE.ProcessHost.Managed.exe, memorizzato nella directory C: \ Programmi (x86) \ Microsoft Visual Studio 14.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TestWindow.

Le versioni precedenti di VS utilizzavano un host diverso, vstest.executionengine.exe. Un cambiamento notevole nel nuovo host di test è che non è più un programma in modalità console. Qualcosa che puoi vedere eseguendo Dumpbin.exe/intestazioni sull'exe.

Un altro modo per vedere il problema sottostante è con Task Manager. Si noti come eseguire un test in una versione precedente di VS causa l'aggiunta di un processo conhost.exe. Questa è la procedura proprietaria della finestra della console per un'app in modalità console. Un problema che ho visto prima è che questo processo tende a perdere, non terminando quando il test è completato. Aggiungendo sempre più istanze di conhost.exe, a un certo punto di questo problema ho avuto 12 di loro in esecuzione. Presumibilmente i cambiamenti in VS2015 avevano lo scopo di risolvere quel problema.

Tecnicamente è possibile configurare il test dell'unità con a .runsettings file e utilizzare l'elemento <ForcedLegacyMode> per forzare l'utilizzo del processo host test precedente. Ciò tuttavia non ha alcun effetto sul risultato di questo test, sembra che l'abbiano affrontato in molti modi.

Questa è una buona dose di ipotesi, ti consiglio di utilizzare connect.microsoft.com per inviare un rapporto di feedback. Puoi citare questo Q + A come riferimento.


Nel frattempo, è possibile considerare una soluzione alternativa. Nota che Console.Clear() è in generale un trouble-maker, ma fallirà anche nel normale utilizzo quando l'output di un'app in modalità console viene reindirizzato. Molto semplice da eseguire da un prompt della riga di comando con l'operatore >. Qual è la ragione ultima per cui fallisce in un test unitario. Dovrai rendere il codice resiliente in modo che possa funzionare correttamente sia in produzione che in un test di unità.In questo modo:

if (!Console.IsOutputRedirected) Console.Clear(); 

Che richiede il targeting .NET 4.5 o successivo. È possibile utilizzare il codice in this SO post se è necessario scegliere come target versioni precedenti.

Problemi correlati