РЕДАКТИРОВАТЬ : я нашел более простой способ сделать это, по крайней мере, когда вы тестируете с пустым кешем. Используйте HttpRunTime.Cache в качестве возвращаемого значения для вашего ожидания в свойстве Cache HttpContext. Для более сложных сценариев использование оболочки и насмешек может быть лучшим способом справиться с этим - например, если вам нужно протестировать исключения из кэша.
var httpContext = MockRepository.GenerateMock<HttpContextBase>();
httpContext.Expect( h => h.Cache ).Return( HttpRunTime.Cache ).Repeat.Any()
Оригинал
Класс-обертка - это путь, но я думаю, что вы применяете его не в том месте. Я бы дал своему контроллеру свойство CacheWrapper, а затем создал конструктор, который позволил бы мне передать экземпляр CacheWrapper, в который можно установить это свойство. По умолчанию контроллер создает CacheWrapper с использованием HttpContext.Current.Cache. В вашем тестовом коде создайте фиктивный CacheWrapper для передачи в конструктор контроллера. Таким образом, вам вообще не нужно создавать фиктивный объект Cache - это сложно, потому что это запечатанный класс.
В качестве альтернативы, вы можете просто создать экземпляр класса Cache и вернуть его, поскольку для него есть открытый конструктор. Преимущество использования mock состоит в том, что вы можете проверить, что 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();
}