Модульное тестирование действия контроллера, когда свойство Response назначено внутри действия - PullRequest
0 голосов
/ 29 февраля 2020

Я видел ту же самую проблему в этой записи , но ни одно из решений не работает сейчас в ASP. Net Core 2.2. Когда я отлаживаю модульный тест, свойство Response по-прежнему равно нулю, и поэтому тест не пройден. Я читал основные документы asp. net, чтобы узнать, как имитировать ControllerContext, чтобы свойство Response имело значение, но я не смог найти ничего работающего.

Вот строка внутри действия, которое создает проблемы:

Response.Headers.Add("Access-Control-Expose-Headers", "Content-Range");

Итак, что я закончил в модульном тесте:

        var routeData = new RouteData();
        routeData.Values.Add("controller", "Home");

        var headerDictionary = new HeaderDictionary();
        var response = new Mock<HttpResponse>();
        response.SetupGet(r => r.Headers).Returns(headerDictionary);

        var httpContext = new Mock<HttpContext>();
        httpContext.SetupGet(a => a.Response).Returns(response.Object);

        var actionContext = new ActionContext(
            httpContext.Object,
            routeData, 
            new ControllerActionDescriptor());

        _controller.ControllerContext = new ControllerContext(actionContext);

1 Ответ

0 голосов
/ 29 февраля 2020

Многих настроек можно избежать, используя DefaultHttpContext, в котором уже были бы заполнены необходимые свойства. Сюда входит Response и его члены

//..

var routeData = new RouteData();
routeData.Values.Add("controller", "Home");

var httpContext = DefaultHttpContext(); //<--

var actionContext = new ActionContext(
    httpContext,
    routeData, 
    new ControllerActionDescriptor());

_controller.ControllerContext = new ControllerContext(actionContext);

//...

. После проверки испытуемого субъекта может быть получен ответ, полученный из контекста, используемого контроллером, и заявленное желаемое поведение.

//...

//Assert
var response = httpContext.Response;
var key = "Access-Control-Expose-Headers";
Assert.True(response.Headers.TryGetValues(key, out var value));
Assert.Equals("Content-Range", value.FirstOrDefault()
...