У меня есть некоторые захваты Http-запросов, которые я хотел бы смоделировать с моим MVC-приложением, чтобы проверить его как можно ближе к реальной среде. Но чтобы иметь возможность отлаживать приложение во время выполнения модульного теста, приложение должно быть запущено одновременно с тестом. Есть ли способ сделать это?
P.S. Я попытался выбрать путь DefaultControllerFactory
и пойти тем же путем, как и в обычном случае, когда MVC-фреймворк обрабатывает запрос Http, но не удалось заставить все части работать вместе, HttpRequest
, HttpContext
, RequestContext
, RouteData
, Много компонентов! Поэтому любая помощь на этом пути также будет оценена.
Это код, который я использую для пути MVC,
var context = new HttpContextWrapper(HttpContext.Current);
RouteData routeData = new RouteData();
routeData.Values.Add("{action}", "ActionName");
var requestContext = new RequestContext(context, routeData);
DefaultControllerFactory factory = new DefaultControllerFactory();
IController controller = factory.CreateController(requestContext, "HomeController");
// Set Form data of the request
controller.Execute(requestContext);
Этот код вызывает исключение в методе CreateController
, говорящем, что этот метод нельзя вызвать на этапе предварительной инициализации. Также свойство Request
для HttpContext
пусто, поэтому я не могу установить значения для его формы. Я попытался устранить исключение, добавив следующий AppSettings
к app.config
, как предложено в другом посте, но все еще получал то же исключение.
<add key="enableSimpleMembership" value="false"/>
<add key="autoFormsAuthentication" value="false"/>
Кроме того, поскольку это модульное тестирование, а ток HttpContext
недоступен, я использую следующий метод, чтобы подделать, а затем установить ток HttpContext
перед запуском этого кода.
public HttpContext FakeHttpContext()
{
var httpRequest = new HttpRequest("", "http://stackoverflow/", "");
var stringWriter = new StringWriter();
var httpResponse = new HttpResponse(stringWriter);
var httpContext = new HttpContext(httpRequest, httpResponse);
var sessionContainer = new HttpSessionStateContainer("id", new SessionStateItemCollection(),
new HttpStaticObjectsCollection(), 10, true,
HttpCookieMode.AutoDetect,
SessionStateMode.InProc, false);
httpContext.Items["AspSession"] = typeof(HttpSessionState).GetConstructor(
BindingFlags.NonPublic | BindingFlags.Instance,
null, CallingConventions.Standard,
new[] { typeof(HttpSessionStateContainer) },
null)
.Invoke(new object[] { sessionContainer });
return httpContext;
}