Модульный тест HttpContext.Current.Cache или другие методы на стороне сервера в C #? - PullRequest
33 голосов
/ 29 января 2009

При создании модульного теста для класса, который использует HttpContext.Current.Cache класс , я получаю сообщение об ошибке при использовании NUnit. Функциональность является основной - проверьте, есть ли элемент в кэше, и если нет, создайте его и поместите в:

if (HttpContext.Current.Cache["Some_Key"] == null) {
    myObject = new Object();
    HttpContext.Current.Cache.Insert("Some_Key", myObject);
}
else {
    myObject = HttpContext.Current.Cache.Get("Some_Key");
}

При вызове этого из модульного теста происходит сбой при значении NullReferenceException при обнаружении первой строки Cache. В Java я бы использовал Cactus для тестирования серверного кода. Есть ли подобный инструмент, который я могу использовать для кода C #? Этот вопрос SO упоминает фиктивные рамки - это единственный способ проверить эти методы? Есть ли подобный инструмент для запуска тестов на C #?

Кроме того, я не проверяю, является ли Cache нулевым, поскольку я не хочу писать код специально для модульного теста и предполагаю, что он всегда будет действительным при работе на сервере. Это допустимо, или я должен добавить нулевые проверки вокруг кэша?

Ответы [ 14 ]

0 голосов
/ 26 сентября 2012

Пример для тех, кто использует MVC 3 и MOQ:

Мой метод контроллера имеет следующую строку:

model.Initialize(HttpContext.Cache[Constants.C_CustomerTitleList] 
as Dictionary<int, string>);

Таким образом, любой модульный тест не пройден, поскольку я не настраиваю HttpContext.Cache.

В моем модульном тесте я устроился следующим образом:

 HttpRuntime.Cache[Constants.C_CustomerTitleList] = new Dictionary<int, string>();

 var mockRequest = new Mock<HttpRequestBase>();
 mockRequest.SetupGet(m => m.Url).Returns(new Uri("http://localhost"));

 var context = new Mock<HttpContextBase>(MockBehavior.Strict);
 context.SetupGet(x => x.Request).Returns(mockRequest.Object);
 context.SetupGet(x => x.Cache).Returns(HttpRuntime.Cache);

 var controllerContext = new Mock<ControllerContext>();
 controllerContext.SetupGet(x => x.HttpContext).Returns(context.Object);

 customerController.ControllerContext = controllerContext.Object;
0 голосов
/ 28 мая 2009

Объект кеша трудно смоделировать, потому что это запечатанная область .NET Framework. Обычно я обхожу это путем создания класса-обертки кэша, который принимает объект диспетчера кэша. Для тестирования я использую диспетчер ложного кэша; для производства я использую менеджер кеша, который фактически обращается к HttpRuntime.Cache.

По сути, я сам абстрагирую кеш.

0 голосов
/ 28 мая 2009

Как все говорили здесь, есть проблема с HTTPContext, в настоящее время Typemock является единственной платформой, которая может подделать ее напрямую без каких-либо оберток или абстракций.

0 голосов
/ 29 января 2009

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

Инстанциация - это следующий вопрос. Для этого можно использовать несколько шаблонов дизайна. См., Например, известные шаблоны GangOfFour Creational ( GOF ) или шаблоны внедрения зависимостей.

ASP.Net MVC фактически использует этот интерфейсный подход и поэтому гораздо больше подходит для модульного тестирования.

...