c# - unitarias - unit test visual studio
Excepción "El identificador no es válido" en el corredor de pruebas de Visual Studio 2015 (1)
Descubrí que una de mis pruebas que pasa en VS2013 está fallando en VS2015, la prueba llama a un servicio que incluye entre otras cosas una llamada a Console.Clear();
para averiguar qué está pasando hice una prueba de unidad simple
[TestMethod]
public void ExampleTest()
{
Console.Clear();
}
Esta prueba pasa en visual studio 2013 pero en 2015 obtengo el siguiente error:
Nombre de la prueba: Ejemplo de la prueba de la prueba Nombre completo: solución.Prueba.Prueba.Caché Manejador.Ejemplo Fuente de la prueba: C: / solución.Prueba.Prueba.cubierta: prueba de la línea 34 Resultado de la prueba: Falla Duración de la prueba: 0: 00: 00.3015003
Resultado StackTrace: en System.IO .__ Error.WinIOError (Int32 errorCode, String maybeFullPath) en System.Console.GetBufferInfo (Boolean throwOnNoConsole, Boolean & successed) en System.Console.Clear ()
en sol.Common.Test.CacheManagerTest.ExampleTest () en C: / solution.Common.Test / CacheManagerTest.cs: línea 35 Mensaje de resultado:
Método de prueba Alexandria.Common.Test.CacheManagerTest.ExampleTest lanzó la excepción: System.IO.IOException: el identificador no es válido.
Entiendo que es un mal diseño para que mi servicio falle si no es llamado por una consola. La razón por la que hago esta pregunta es para comprender por qué esto falla en la nueva versión de Visual Studio. ¿Es este el comportamiento pretendido? ¿Qué cambió?
No vi nada obvio en el registro de cambios que pudiera estar relacionado con esto.
Edit: Estoy llamando a Console.clear desde la siguiente dll
Microsoft / Framework.NETFramework / v4.5.1 / mscorlib.dll
Edición 2:
Imagen de las propiedades del proyecto de prueba en ambos estudios visuales.
Los cambios en VS2015 son bastante visibles, use Test> Debug> All Tests para obtener información. Puede ver que ahora tiene un nuevo proceso de host de prueba, su nombre es TE.ProcessHost.Managed.exe
, almacenado en C: / Archivos de programa (x86) / Microsoft Visual Studio 14.0 / Common7 / IDE / CommonExtensions / Microsoft / TestWindow directorio.
Las versiones anteriores de VS utilizaban un host diferente, vstest.executionengine.exe. Un cambio notable en el nuevo host de prueba es que ya no es un programa en modo consola. Algo que puede ver ejecutando Dumpbin.exe / headers en el exe.
Otra forma de ver el problema subyacente es con el Administrador de tareas. Observe cómo la ejecución de una prueba en una versión anterior de VS hace que se conhost.exe
un proceso conhost.exe
. Este es el proceso que posee la ventana de la consola para una aplicación en modo consola. Un problema que he visto antes es que este proceso tiende a filtrarse y no termina cuando finaliza la prueba. Agregando cada vez más instancias de conhost.exe, en un punto investigando este problema tenía 12 de ellas en ejecución. Presumiblemente, los cambios en VS2015 estaban destinados a abordar ese problema.
Técnicamente, puede configurar la prueba unitaria con un archivo .runsettings y usar el elemento <ForcedLegacyMode>
para forzar el uso del antiguo proceso de host de prueba. Sin embargo, esto no tiene ningún efecto en el resultado de esta prueba, parece que abordaron esto de múltiples maneras.
Esa es una buena cantidad de adivinanzas, le recomiendo que use connect.microsoft.com para presentar un informe de comentarios. Puede citar este Q + A para referencia.
Mientras tanto, puedes considerar una solución alternativa. Tenga en cuenta que Console.Clear()
es, en general, un creador de problemas, también fallará en el uso normal cuando se redirija la salida de una aplicación en modo consola. Muy fácil de hacer desde un indicador de línea de comandos con el operador >
. Cuál es la razón última por la que falla en una prueba unitaria. Querrá que el código sea resistente para que funcione correctamente tanto en producción como en una prueba unitaria. Me gusta esto:
if (!Console.IsOutputRedirected) Console.Clear();
Lo que requiere apuntar a .NET 4.5 o superior. Puede usar el código en esta publicación SO si necesita dirigirse a versiones anteriores.