Solo estoy jugando con los contratos de código en .NET 4.0 y me falta algo obvio, ya que no se comportan como era de esperar.Contratos de código de prueba unitaria
Siempre he usado una sentencia simple si ... then .. throw para realizar cualquier validación al inicio de una función.
if (hours < 0 || hours > 8)
throw new ArgumentOutOfRangeException("hours", "Hours must be between 0 and 8");
he sustituido simplemente esto con
Contract.Requires<ArgumentOutOfRangeException>(hours >= 0 && hours <= 8, "Hours must be between 0 and 8");
pero nunca parece arrojar un problema en mis pruebas de unidad.
public static DurationUnit HoursAsDuration(int hours)
{
Contract.Requires<ArgumentOutOfRangeException>(hours >= 0 && hours <= 8, "Hours must be between 0 and 8");
switch (hours)
{
case 1:
case 2:
return DurationUnit.Quarter;
case 3:
case 4:
return DurationUnit.Half;
case 5:
case 6:
return DurationUnit.ThreeQuarter;
case 7:
case 8:
return DurationUnit.Full;
default:
return DurationUnit.None;
}
}
[Test]
public void CanConvertToDuration()
{
Assert.AreEqual(DurationUnit.None, DateTimeUtility.HoursAsDuration(0));
Assert.AreEqual(DurationUnit.Quarter, DateTimeUtility.HoursAsDuration(1));
Assert.AreEqual(DurationUnit.Quarter, DateTimeUtility.HoursAsDuration(2));
Assert.AreEqual(DurationUnit.Half, DateTimeUtility.HoursAsDuration(3));
Assert.AreEqual(DurationUnit.Half, DateTimeUtility.HoursAsDuration(4));
Assert.AreEqual(DurationUnit.ThreeQuarter, DateTimeUtility.HoursAsDuration(5));
Assert.AreEqual(DurationUnit.ThreeQuarter, DateTimeUtility.HoursAsDuration(6));
Assert.AreEqual(DurationUnit.Full, DateTimeUtility.HoursAsDuration(7));
Assert.AreEqual(DurationUnit.Full, DateTimeUtility.HoursAsDuration(8));
//Would expect this to cause an issue
Assert.AreEqual(DurationUnit.None, DateTimeUtility.HoursAsDuration(9));
}
La prueba devuelve cierto, pero me habría esperado que el contrato de código para detener el valor de "9" entrar en la sentencia switch. Es este el comportamiento esperado?
Gracias a Pascal que aclara un poco las cosas. Creía que los contratos de código podrían reemplazar todas las comprobaciones de parámetros, pero aún deberán permanecer si los quiero en la compilación de producción. – fluent
Actualización: Porges a continuación me ha señalado en la dirección correcta al editar la configuración del proyecto para habilitar los contratos en la compilación de producción. – fluent