Como ya notó Henk, suprimir la interfaz de usuario es inútil, porque quiere que su código falle. Cuando no se desea cambiar su código, puede escribir una escucha de seguimiento personalizado que se produce una excepción, de la siguiente manera:
public class ProductionTraceListener : DefaultTraceListener
{
public override void Fail(string message, string detailMessage)
{
string failMessage = message;
if (detailMessage != null)
{
failMessage += " " + detailMessage;
}
throw new AssertionFailedException(failMessage);
}
}
[Serializable]
public class AssertionFailedException : Exception
{
public AssertionFailedException() { }
public AssertionFailedException(string message) : base(message) { }
public AssertionFailedException(string message, Exception inner)
: base(message, inner) { }
protected AssertionFailedException(SerializationInfo info,
StreamingContext context) : base(info, context) { }
}
Y usted puede registrarlo como sigue:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<trace>
<listeners>
<clear />
<add name="Default"
type="[Namespace].ProductionTraceListener, [Assembly]" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
Como ya se podría esperar del nombre del oyente del seguimiento ProductionTraceListener
, uso esa cosa en mi entorno de producción (aplicaciones web) y no en las pruebas de mi unidad. Si bien puede usar este truco en las pruebas de su unidad, le aconsejo que cambie su código. IMO solo debe usar afirmaciones para rutas de código que nunca deberían ejecutarse, y si lo hacen, la prueba debería fallar. En su situación, quiere tener una prueba exitosa cuando falla una afirmación, lo cual es contrario a la intuición.
Mi consejo es cambiar el código y usar las comprobaciones normales de if (x) throw ArgumentException()
para ver si hay condiciones previas (o usar CuttingEdge.Conditions) y usar esas afirmaciones solo para rutas de código que nunca deberían ejecutarse. También intente usar Trace.Assert
en lugar de Debug.Assert
, porque también desea que esos comprobantes se comprueben en su entorno de producción. Cuando lo haya hecho, puede usar el ProductionTraceListener
en su entorno de producción, y este UnitTestTraceListener
en su unidad prueba.
public class UnitTestTraceListener : DefaultTraceListener
{
public override void Fail(string message, string detailMessage)
{
string failMessage = message;
if (detailMessage != null)
{
failMessage += " " + detailMessage;
}
// Call to Assert method of used unit testing framework.
Microsoft.VisualStudio.TestTools.UnitTesting.Assert.Fail(
failMessage);
}
}
Buena suerte.
Esto se vería bien para Trace.Assert(), pero el OP menciona Debug.Assert(). –
Además, desea que el código falle * en las pruebas unitarias * cuando las ejecuta como parte de un proceso de compilación automatizado. Los Asserts son para que los desarrolladores se beneficien al ejecutar el código. – Rob
@Henk && @Rob: No estoy seguro de seguirte. La configuración de 'ProductionTraceListener' en el entorno de prueba de la unidad permitiría que las pruebas de la unidad fallaran cuando los métodos no lanzaran la 'AssertionFailedException' esperada. Cuando las pruebas unitarias se ejecutan en modo de depuración, esto hará exactamente lo que él quiera, ¿no es así? Por favor iluminame. – Steven