Tag Archive for programming

XUnit.NET Extensions, FreezeClock

FreezeClock es uno de esos atributos maravillosos de XUnit.NET, nos permite “congelar” el reloj (tal como lo dice su nombre) en un tiempo dado y de esa manera comprobar que operaciones que dependen de tiempo se lleven acabo exitosamente. En versiones anteriores a la 1.5 FreezeClock cambiaba el tiempo mostrado por DateTime.Now, pero esto causaba problemas con ciertas implementaciones, así que en XUnit.NET 1.5 se debe utilizar la clase Clock y su propiedad Now (Clock.Now) en vez de DateTime.Now para efectos de las pruebas, de igual manera podríamos ver a Clock.Now como un clon de DateTime.Now en todos sus sentidos.

[Fact]
public void It_should_fail_because_clock_are_not_frozen()
{
    var clock1 = Clock.Now;
    Thread.Sleep(1000);
    var clock2 = Clock.Now;
    Assert.NotEqual(clock1, clock2);
}

[Fact, FreezeClock]
public void It_should_pass_because_clock_are_frozen()
{
    var clock1 = Clock.Now;
    Thread.Sleep(1000);
    var clock2 = Clock.Now;
    Assert.Equal(clock1, clock2);
}

[Fact]
public void Clock_time_must_be_lesser_than_a_second_different_from_now()
{
    var now = DateTime.Now;
    var clock = Clock.Now;
    Assert.True((clock - now).Milliseconds < 1000);
}

XUnit.NET Extensions, Trace y AutoRollback

A veces es necesario (por alguna razón extraña), mostrar el inicio y el fin de un test en la consola, con el tiempo de inicio y tiempo de fin (imaginémonos un test de performance sencillo); para esos menesteres tenemos a nuestro amigo TraceAttribute, que no hace más que enviar a la salida Trace el inicio y el fin del test, un atributo sencillo de entender.

[Fact, Trace]
public void Must_sent_to_trace_console_start_and_end_time_of_test()
{
    Assert.True(true);
}
AutoRollbackAttribute

Comunmente cuando trabajamos con bases de datos, es bastante común el toparnos con transacciones, o mejor aún, toparnos con código que para simplificarnos las cosas debería correr dentro de una transacción. Por ejemplo, un test contra la base de datos que haga ciertos inserts, pero al final del test no nos importa el resultado y simplemente descartamos la transacción, por lo tanto nada fue insertado o modificado en la base de datos. Para esas tareas tenemos al atributo AutoRollbackAttribute, que simplemente al inicio del test crea una transacción y al final del test descarta la transacción. Es dificil probar código transaccional, pero con la “descripción” de que realiza el test, simplemente podemos ver si hay o no una transacción creada.

// NOTE: It Requires referece to System.Transactions
[Fact]
public void When_no_autorollback_is_present_there_is_no_transaction()
{
    Assert.Null(Transaction.Current);
}

[Fact, AutoRollback]
public void When_autorollback_is_present_there_is_a_transaction()
{
    Assert.NotNull(Transaction.Current);
}

Comprimiendo “páginas” en asp.net

Problema de Culturas en la .Net Framework

Hoy es de esos dias cuando uno se topa con cosas que solo le queda decir “w00t”… Pasé durante un buen tiempo peleando con un formato de fecha en un asp.net website. Como algunos sabran ya de antemano, una forma de obligar al website de asp.net a comportarse de una manera específica es agregando esto al web.config:

<system.web>
    <globalization culture="es-PA" />
</system.web>

El parámetro de culture debe ser una “full qualified culture name” o sea, no sólo el idioma sino el carácter regional (en este caso en específico español-Panamá, mi país de origen). Debido a que el proyecto que estoy trabajando es específicamente para ese país, no consideré ningun problema al agregarle la especificidad de cultura.

Luego de revisar todo, me doy cuenta que el formato de fecha corta no se presenta como es de esperar, yo esperaba dd/mm/yyyy y obtenía mm/dd/yyyyy (como el formato de fecha anglosajona). Al revisar las opciones regionales de mi sistema operativo (y de varias máquinas alrededor) me doy cuenta que la Framework correctamente esta proyectando la regionalización para es-PA, eso implica dos cosas:

  • O viví y crecí en Panamá durante más de 19 años y JAMAS los panameños escribimos bien la fecha
  • O Windows XP en adelante, alguien en Microsoft decidió que Panamá tendría un formato de fecha diferente al que los panameños acostumbramos a usar.

Los dolores de cabeza con que uno se topa verdad?

Resolviendo Generics con Unity

Hace unos días alguien en la lista de correo de la Comunidad de Desarrolladores .net de Guatemala preguntó:

Compañeros, alguien sabe si Unity puede resolver Interfaces que tengan genericos, el siguiente codigo si me ejecuta
_contenedor.Resolve<IRepositorio>();
pero cuando ya le pongo una interface que trabaje con genericos ya no me resulve la entidad, ejemplo,
_contenedor.Resolve<IRepositorio<Pedido>>(); 
Gracias.

Bien, la respuesta corta es SI, lo único que debemos decirle a Unity como hacerlo.

Programáticamente:

// Registrandolo
_contenedor.RegisterType(typeof(IRepositorio<>), typeof(Repositorio<>));
// Usandolo
_contendor.Resolve<IRepositorio<Pedido>>();

Como ven es simple de forma programática

Mediante configuración:

<!-- Solo la parte del container, es un snippet -->
<containers>
  <container>
    <types>
      <type type="IRepositorio`1" mapto="MySample, Repositorio`1">
        <lifetime type="singleton" />
      </type>
    </types>
  </container>
</containers>

En este último ejemplo, tomemos con cuidado el uso de los “backtips” con el 1 (`1), esta es la forma en que en la .net framework se representa un generic.

Espero que este simple post le sirva de ayuda a alguien :D