Создание объекта System.Web.Caching.Cache в модульном тесте - PullRequest
9 голосов
/ 28 октября 2008

Я пытаюсь реализовать модульный тест для функции в проекте, который не имеет модульных тестов, и для этой функции в качестве параметра требуется объект System.Web.Caching.Cache. Я пытался создать этот объект с помощью кода, такого как ...

System.Web.Caching.Cache cache = new System.Web.Caching.Cache();
cache.Add(...);

... и затем передача кеша в качестве параметра, но функция Add () вызывает исключение NullReferenceException. Мое лучшее предположение на данный момент заключается в том, что я не могу создать этот объект кэша в модульном тесте, и мне нужно извлечь его из HttpContext.Current.Cache, к которому у меня явно нет доступа в модульном тесте.

Как выполнить модульное тестирование функции, для которой в качестве параметра требуется объект System.Web.Caching.Cache?

Ответы [ 4 ]

8 голосов
/ 28 октября 2008

Когда я сталкиваюсь с такой проблемой (когда рассматриваемый класс не реализует интерфейс), я часто заканчиваю тем, что пишу оболочку со связанным интерфейсом вокруг рассматриваемого класса. Затем я использую свою обертку в моем коде. Для модульных тестов я вручную макетую обертку и вставляю в нее свой собственный фиктивный объект.

Конечно, если фреймворк работает, используйте его вместо этого. Мой опыт показывает, что у всех фальшивых фреймворков есть некоторые проблемы с различными классами .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);

...
2 голосов
/ 28 октября 2008

Я думаю, что вам лучше всего было бы использовать фиктивный объект (загляните в Rhino Mocks).

1 голос
/ 29 октября 2008

Очень полезным инструментом для модульного тестирования унаследованного кода является TypeMock Isolator . Это позволит вам полностью обойти объект кеша, сказав ему о том, чтобы имитировать этот класс и любые вызовы методов, которые вы считаете проблематичными. В отличие от других фальшивых фреймворков, TypeMock использует отражение, чтобы перехватывать вызовы этих методов, которые вы говорите, чтобы они имитировали вас, чтобы вам не приходилось иметь дело с громоздкими обертками.

TypeMock является коммерческим продуктом, но у него есть бесплатные версии для проектов с открытым исходным кодом. Они использовали , чтобы иметь "общественное" издание, которое было лицензией для одного пользователя, но я не знаю, предлагается ли оно еще.

0 голосов
/ 02 августа 2013
var httpResponse = MockRepository.GenerateMock<HttpResponseBase>();
var cache = MockRepository.GenerateMock<HttpCachePolicyBase>();
   cache.Stub(x => x.SetOmitVaryStar(true));
   httpResponse.Stub(x => x.Cache).Return(cache);
   httpContext.Stub(x => x.Response).Return(httpResponse);
   httpContext.Response.Stub(x => x.Cache).Return(cache);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...