У меня проблемы с тестированием контроллеров. Оригинальный мой контроллер для тестирования выглядел примерно так:
SomethingController CreateSomethingController()
{
var somethingData = FakeSomethingData.CreateFakeData();
var fakeRepository = FakeRepository.Create();
var controller = new SomethingController(fakeRepository);
return controller;
}
Это нормально работает для большинства тестирований, пока я не получу часть кода Request.IsAjaxRequest()
. Тогда мне пришлось создать макет HttpContext и HttpRequestBase. Поэтому мой код изменился и теперь выглядит так:
public class FakeHttpContext : HttpContextBase
{
bool _isAjaxRequest;
public FakeHttpContext( bool isAjaxRequest = false )
{
_isAjaxRequest = isAjaxRequest;
}
public override HttpRequestBase Request
{
get
{
string ajaxRequestHeader = "";
if ( _isAjaxRequest )
ajaxRequestHeader = "XMLHttpRequest";
var request = new Mock<HttpRequestBase>();
request.SetupGet( x => x.Headers ).Returns( new WebHeaderCollection
{
{"X-Requested-With", ajaxRequestHeader}
} );
request.SetupGet( x => x["X-Requested-With"] ).Returns( ajaxRequestHeader );
return request.Object;
}
}
private IPrincipal _user;
public override IPrincipal User
{
get
{
if ( _user == null )
{
_user = new FakePrincipal();
}
return _user;
}
set
{
_user = value;
}
}
}
SomethingController CreateSomethingController()
{
var somethingData = FakeSomethingData.CreateFakeData();
var fakeRepository = FakeRepository.Create();
var controller = new SomethingController(fakeRepository);
ControllerContext controllerContext = new ControllerContext( new FakeHttpContext( isAjaxRequest ), new RouteData(), controller );
controller.ControllerContext = controllerContext;
return controller;
}
Теперь он дошел до той стадии в моем контроллере, где я называю Url.Route
, а Url
- ноль. Похоже, мне нужно начать макетирование маршрутов для моего контроллера.
Кажется, я трачу больше времени на поиск того, как подделать / смоделировать объекты, а затем отладить, чтобы убедиться, что мои подделки верны, чем фактическое написание тестового кода. Есть ли более простой способ проверить контроллер? Я посмотрел на TestControllerBuilder от MvcContrib, который помогает с некоторыми проблемами, но, кажется, не делает все. Есть ли что-нибудь еще, что выполнит эту работу и позволит мне сосредоточиться на написании тестов, а не на издевательствах?
Спасибо