Ответ 1
EDIT. Я нашел более простой способ сделать это, по крайней мере, когда вы тестируете пустой кеш. Используйте 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. В тестовом коде создайте mock 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();
}