2010-06-24 33 views
5

Tengo esta clase CacheManager que mantiene un diccionario estático con todo tipo de datos en caché. Sin embargo, con este diccionario como estático, se llena con los datos de las otras pruebas unitarias. Esto me impide realizar pruebas unitarias, ya sea que el CacheManager esté vacío en init o no, y rompe con los principios de las pruebas unitarias.Prueba de unidad CacheManager

¿Alguna idea de cómo crear una prueba de unidad adecuada para esto?

Código

public class CacheManager 
{ 
    private static readonly Dictionary<ICacheKey, ListCacheItem> cacheEntries = 
     new Dictionary<ICacheKey, ListCacheItem>(); 

    public static Dictionary<ICacheKey, ListCacheItem> CacheEntries 
    { 
     get 
     { 
      lock (cacheEntries) 
      { 
       return cacheEntries; 
      } 
     } 
    } 

Respuesta

1

En general, esto no es una buena idea desde una perspectiva de la prueba. Al hacer que los miembros de CacheManager estén estáticos, nunca podrá aislarlos de manera que resulten agradables para la prueba unitaria.

Quizás una solución mejor es Singleton Pattern. Para hacer esto, deshágase de los modificadores estáticos en los miembros de CacheManager. Luego puede tener una instancia estática en su aplicación que sea utilizada por todos los demás. Por lo tanto, en su prueba de unidad, podría crear una nueva instancia de la clase que pueda probar de forma aislada, pero que aún tenga la funcionalidad deseada.

+0

¿Cómo es esto mejor? ¿El singleton tampoco mantendrá los valores entre pruebas? – koenmetsu

+0

Correcto, el Singleton lo hará. Pero puede crear una instancia del 'CacheManager' y probar sus miembros de forma aislada. Luego, en otras pruebas, por ejemplo, puede asegurarse de que todas las demás partes de su aplicación estén usando la misma instancia de Singleton. – dyross

+0

Entonces, ¿su solución sería crear una nueva clase Singleton que contenga una instancia de CacheManager como uno de sus miembros? – koenmetsu

1

Respuesta breve: no se puede hacer correctamente. Las pruebas unitarias y estáticas no funcionan muy bien juntas, usted (casi) siempre se encontrará con problemas como el que mencionó.

Respuesta más larga: la mejor solución sería refactorizar su código. Incluso si necesita el comportamiento singleton, tiene varias opciones (por ejemplo, inyección de dependencia). La recomendación de David es, por supuesto, también una opción que al menos le permite probar su caché, pero puede tener problemas cuando quiera probar el resto del sistema.

Si por algún motivo desea mantener su diseño actual, puede tener algunas soluciones temporales (no es necesario). Algunos ejemplos:

Lo más fácil podría ser agregar un método "cleanCache". En algunas situaciones, podría ser incluso útil para el resto del sistema, y ​​cada una de sus pruebas también podría hacerlo como primer paso (en "setup/beforeTest o métodos similares").

También podría jugar con la visibilidad y dejar que sus pruebas hagan una limpieza que no está permitida para el resto del código.

Estos hacks probablemente funcionen siempre que no ejecutes tus pruebas en paralelo.