EDITAR: He encontrado una manera más fácil de hacer esto, por lo menos cuando se está probando con un caché vacía. Use HttpRunTime.Cache como el valor de retorno para su expectativa en la propiedad Cache de HttpContext. Para escenarios más avanzados, usar un contenedor y burlarse puede ser una mejor manera de manejarlo, por ejemplo, si necesita probar excepciones de la memoria caché.
var httpContext = MockRepository.GenerateMock<HttpContextBase>();
httpContext.Expect(h => h.Cache).Return(HttpRunTime.Cache).Repeat.Any()
original:
La clase contenedora es el camino a seguir, pero creo que lo está aplicando en el lugar equivocado. Le daría a mi controlador una propiedad CacheWrapper, luego crearía un constructor que me permitiera pasar una instancia de CacheWrapper a la cual se puede establecer esta propiedad. Por defecto, el controlador crea un CacheWrapper usando HttpContext.Current.Cache. En su código de prueba, construya un falso CacheWrapper para pasar al constructor del controlador. De esta forma, no es necesario crear un objeto de caché falso, lo que es difícil porque es una clase sellada.
Alternativamente, podría instanciar una instancia de la clase Cache y devolverla, ya que hay un constructor público para ella. Usar el simulacro tiene la ventaja de que puedes verificar que el Caché se esté utilizando a través de las expectativas, sin embargo, así que probablemente vaya con el envoltorio.
public class CacheWrapper
{
private Cache Cache { get; set; }
public CacheWrapper()
{
this.Cache = HttpContext.Current.Cache;
}
public virtual Object Add(string key,
Object value,
CacheDependency dependencies,
DateTime absoluteExpiration,
TimeSpan slidingExpiration,
CacheItemPriority priority,
CacheItemRemovedCallback onRemoveCallback)
{
this.Cache.Add(key,
value,
dependencies,
absoluteExpiration,
slidingExpiration,
priority,
onRemoveCallback);
}
...wrap other methods...
}
public class BaseController : Controller
{
private CacheWrapper { get; set; }
public BaseController() : this(null) { }
public BaseController(CacheWrapper cache)
{
this.CacheWrapper = cache ?? new CacheWrapper();
}
}
[TestMethod]
public void CacheTest()
{
var wrapper = MockRepository.GenerateMock<CacheWrapper>();
wrapper.Expect(o => o.Add(...)).Return(...);
var controller = new BaseController(wrapper);
var result = controller.MyAction() as ViewResult;
Assert.AreEqual(...);
wrapper.VerifyAllExpectations();
}
La nota excelente realmente ayudó a simplificar todo el proceso – P6345uk