Запустите приложение MVC одновременно с юнит-тестами - PullRequest
0 голосов
/ 05 марта 2019

У меня есть некоторые захваты 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;
    }
...