编辑:我找到了一种更简单的方法,至少在您使用空缓存进行测试时是这样。使用 HttpRunTime.Cache 作为您对 HttpContext 的 Cache 属性的期望的返回值。对于更高级的场景,使用包装器和模拟可能仍然是更好的处理方式——例如,如果您需要测试缓存中的异常。
var httpContext = MockRepository.GenerateMock<HttpContextBase>();
httpContext.Expect( h => h.Cache ).Return( HttpRunTime.Cache ).Repeat.Any()
原创:
包装类是要走的路,但我认为你在错误的地方应用它。我会给我的控制器一个 CacheWrapper 属性,然后创建一个构造函数,允许我传入一个可以设置该属性的 CacheWrapper 实例。默认情况下,控制器使用 HttpContext.Current.Cache 创建一个 CacheWrapper。在您的测试代码中,构造一个模拟 CacheWrapper 以传递给控制器的构造函数。这样一来,您根本不需要创建模拟 Cache 对象——这很困难,因为它是一个密封的类。
或者,您可以只实例化 Cache 类的实例并返回它,因为它有一个公共构造函数。使用模拟的优点是您可以通过期望验证缓存是否正在使用,所以我可能会使用包装器。
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();
}