Ошибка при попытке создать Mock.Of <ControllerContext>() для ASP. Net Core 3.1 Unit Test - PullRequest
1 голос
/ 17 апреля 2020

В соответствии с последним разделом быстрого запуска Moq, определенным здесь , я пытаюсь настроить следующий макет для передачи значений формы в тестируемый метод контроллера:

var formCollection = new FormCollection(
                new System.Collections.Generic.Dictionary<string, Microsoft.Extensions.Primitives.StringValues>()
            {
                    {"mAction", "someAction" },
                    {"mRefId", "0" }
            });

        var controllerContext = Mock.Of<ControllerContext>(ctx =>
            ctx.HttpContext.Request.Form == formCollection);

        controller.ControllerContext = controllerContext;

Однако при запуске теста происходит сбой в строке Mock.Of<> со следующей ошибкой:

System.NotSupportedException: неподдерживаемое выражение: mock => mock.HttpContext

Non переопределяемые члены (здесь: ActionContext.get_HttpContext) не могут использоваться в выражениях настройки / проверки.

Чего мне не хватает? Разве я не делаю это так же, как в примере, определенном в документе «Быстрый старт»?

1 Ответ

0 голосов
/ 17 апреля 2020

Ошибка в том, что свойство ControllerContext.HttpContext не равно virtual, поэтому Moq не может переопределить его.

Рассмотрите возможность использования фактического ControllerContext и высмеивание HttpContext для присвоения свойству

var formCollection = new FormCollection(new Dictionary<string, StringValues>()
    {
        {"mAction", "someAction" },
        {"mRefId", "0" }
    });

var controllerContext = new ControllerContext() {
    HttpContext = Mock.Of<HttpContext>(ctx => ctx.Request.Form == formCollection)
};

controller.ControllerContext = controllerContext;

Или даже с использованием DefaultHttpContext и присвоения желаемых значений

var formCollection = new FormCollection(new Dictionary<string, StringValues>()
    {
        {"mAction", "someAction" },
        {"mRefId", "0" }
    });

var httpContext = new DefaultHttpContext();
httpContext.Request.Form = formCollection;
var controllerContext = new ControllerContext() {
    HttpContext = httpContext
};

controller.ControllerContext = controllerContext;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...