Hace un tiempo escribía sobre los fakes, como usarse y como sacarle partido. Los ejemplos estaban dirigidos casi exclusivamente a los stubs, y prometimos escribir un post con las diferencias entre Stubs y los Shims.

Para empezar diremos que ambos forman parte del framework de Microsoft, Microsoft Fakes, que tiene como objetivo el aislamiento del código y de los métodos que se quieren probar.

Para poder usarlo hay que tener en cuenta que es muy útil diseñar el código desde un primer momento con el objetivo claro de que se puedan realizar pruebas automáticas sobre el, si bien esto no es requisito indispensable y se pueden crear sustitutos de código al que no tenemos acceso o es de terceros.

¿Qué es un Stubs?

Es una pequeña clase que implementa el mismo interfaz que la clase a sustituir, de manera que injectada en una clase remplaza el funcionamiento normal de la aplicación sustituyendo la funcionalidad de la que depende por una porción contralada de la misma.

Por ejemplo un stub de un repositorio de usuarios, su método Get devolvería una lista de usuarios controlada sin tener que hacer el acceso a datos.

¿Qué es un shims?

Es un sustituto, se utiliza para ejecutar otro código en vez del que se esperaba para poder probar código sin necesidad de depender de código de terceros.

Podemos utilizar shims cuando nuestro código no depende de interfaces y el reemplazar un componente por otro se realizará a través de un sustituto.

Cuando utilizar un Stubs

Para poder utilizar Stubs, hay que pensar que nuestro código debe estar realizado de manera desacoplada, realizando una inversión de la dependencia.

De manera que el sustituto se puede inyectar en el método o clase a probar sin necesidad de refactorizar nuestro código, es decir, que el sustituto es inyectado y no instanciado dentro del método a probar.

Por lo tanto se utilizarán Stubs cuando nuestro código sea desacoplado, desarrollado pensando en pruebas (TDD) y nuestro método no instancie clases dentro de su código, sino que estas estén inyectadas.

 

No hay que olvidad que los Stubs son un método de aislamiento de código, que permite la inyección de una clase con el mismo interfaz que la original y cuyo resultado es controlado por el programador dotando a la aplicación de un entorno controlado en el cual la aplicación se encuentra en un estado y según ese estado debe devolver unos resultados.

Cuando utilizar un Shims

Los Shims son clases que solo deben usarse cuando se quiere probar código que de otra manera no sería posible probar.

No requiere que el código sea diseñado para que sea “testeable” o lo que es lo mismo no tiene por qué estar diseñado teniendo en cuenta las pruebas.

No requiera que sea inyectado como una dependencia, por lo que no requiere de un componente externo (como los frameworks de inyección de dependencias)

Los Shims interceptan el flujo de ejecución y sustituye el componente externo en otro deseado y comprobado.

Codigo de ejemplo en shims:

[TestMethod]

public void DateTimeTes()

{

using (ShimsContext.Create())

{

// Arrange:

System.Fakes.ShimDateTime.NowGet = () => { return new DateTime(2016, 2, 29); };

// Act

int result = MyCode.DoSomethingSpecialOnALeapYear();

// Assert

Assert.AreEqual(100, result);

}

}

 

Anuncios