2008-10-28 20 views
9

Estoy tratando de implementar una prueba de unidad para una función en un proyecto que no tiene pruebas de unidad y esta función requiere un System.Web.Caching. Caché del objeto como parámetro He estado tratando de crear este objeto mediante el uso de código como ...Creando un objeto System.Web.Caching.Cache en una prueba de unidad

System.Web.Caching.Cache cache = new System.Web.Caching.Cache(); 
cache.Add(...); 

... y después de pasar el 'caché' como un parámetro, pero la función de Agregar() está causando un NullReferenceException. Mi mejor estimación hasta ahora es que no puedo crear este objeto de caché en una prueba de unidad y necesito recuperarlo de HttpContext.Current.Cache, que obviamente no tengo acceso en una prueba de unidad.

¿Cómo se prueba la unidad de una función que requiere un objeto System.Web.Caching.Cache como parámetro?

+1

¿Puedes corregir la ortografía de la pregunta para que las personas la encuentren más fácil? Cachcing = Caching (no estoy tratando de molestarlo ni nada, simplemente estoy tratando de ayudarlo) – Chris

Respuesta

8

Cuando me enfrenté a este tipo de problema (donde la clase en cuestión no implementa una interfaz), a menudo termino escribiendo un contenedor con la interfaz asociada alrededor de la clase en cuestión. Luego uso mi envoltorio en mi código. Para las pruebas unitarias, me burlo del envoltorio e inserto en él mi propio objeto simulado.

Por supuesto, si funciona un marco de burla, utilícelo en su lugar. Mi experiencia es que todos los frameworks burladores tienen algunos problemas con varias clases .NET.

public interface ICacheWrapper 
{ 
    ...methods to support 
} 

public class CacheWrapper : ICacheWrapper 
{ 
    private System.Web.Caching.Cache cache; 
    public CacheWrapper(System.Web.Caching.Cache cache) 
    { 
     this.cache = cache; 
    } 

    ... implement methods using cache ... 
} 

public class MockCacheWrapper : ICacheWrapper 
{ 
    private MockCache cache; 
    public MockCacheWrapper(MockCache cache) 
    { 
     this.cache = cache; 
    } 

    ... implement methods using mock cache... 
} 

public class MockCache 
{ 
    ... implement ways to set mock values and retrieve them... 
} 

[Test] 
public void CachingTest() 
{ 
    ... set up omitted... 

    ICacheWrapper wrapper = new MockCacheWrapper(new MockCache()); 

    CacheManager manager = new CacheManager(wrapper); 

    manager.Insert(item,value); 

    Assert.AreEqual(value, manager[item]); 
} 

código real

... 

CacheManager manager = new CacheManager(new CacheWrapper(HttpContext.Current.Cache)); 

manager.Add(item,value); 

... 
2

Creo que su mejor opción sería usar un objeto simulado (mire en Rhino Mocks).

1

Una herramienta muy útil para el código heredado la unidad de pruebas es TypeMock Isolator. Te permitirá omitir completamente el objeto de caché diciéndole que se burle de esa clase y de cualquier método que te resulte problemático. A diferencia de otros frameworks simulados, TypeMock utiliza la reflexión para interceptar aquellas llamadas a métodos que le dices que se burlen de ti, para que no tengas que lidiar con engorrosos contenedores.

TypeMock es un producto comercial, pero tiene versiones gratuitas para proyectos de código abierto. Ellos usaron para tener una edición de "comunidad" que era una licencia de usuario único pero no sé si aún se ofrece.

0
var httpResponse = MockRepository.GenerateMock<HttpResponseBase>(); 
var cache = MockRepository.GenerateMock<HttpCachePolicyBase>(); 
    cache.Stub(x => x.SetOmitVaryStar(true)); 
    httpResponse.Stub(x => x.Cache).Return(cache); 
    httpContext.Stub(x => x.Response).Return(httpResponse); 
    httpContext.Response.Stub(x => x.Cache).Return(cache);