Когда я сталкиваюсь с такой проблемой (когда рассматриваемый класс не реализует интерфейс), я часто заканчиваю тем, что пишу оболочку со связанным интерфейсом вокруг рассматриваемого класса. Затем я использую свою обертку в моем коде. Для модульных тестов я вручную макетую обертку и вставляю в нее свой собственный фиктивный объект.
Конечно, если фреймворк работает, используйте его вместо этого. Мой опыт показывает, что у всех фальшивых фреймворков есть некоторые проблемы с различными классами .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] );
}
Реальный код
...
CacheManager manager = new CacheManager( new CacheWrapper( HttpContext.Current.Cache ));
manager.Add(item,value);
...