Запрос Mock ControllerBase с использованием Moq - PullRequest
0 голосов
/ 10 октября 2019

У меня есть Web API в .Net Core 2.2, как показано ниже:

[Authorize]
[Route("api/[controller]")]
[ApiController]
public class SomeController : ControllerBase
{
    [HttpPost]
    public async Task<string> SomeMethodPost()
    {
        string returnUrl = $"{this.Request.Scheme}://{this.Request.Host}{this.Request.PathBase}/some/redirect";

        //Some Third Part Service Call

        return serviceResult;
    }
}

Я хочу смоделировать свойства «Схема», «Хост» и «PathBase» для действия моего контроллера в модульном тесте. ,Мне удалось написать следующий код в моем методе модульного теста:

var request = new Mock<HttpRequest>(MockBehavior.Strict);
request.Setup(x => x.Scheme).Returns("http");
request.Setup(x => x.Host).Returns(HostString.FromUriComponent("http://localhost:8080"));
request.Setup(x => x.PathBase).Returns(PathString.FromUriComponent("/api"));

var mockHttp = new Mock<ControllerBase>(MockBehavior.Strict);
mockHttp.SetupGet(x => x.Request).Returns(request.Object);

Однако, макет в последней строке вызывает исключение, так как "Request" из "ControllerBase" не может быть переопределено. Я понимаю ограничение не виртуальных свойств абстрактных классов. Есть ли обходной путь для этого?

Версия Moq - 4.13.0.

1 Ответ

2 голосов
/ 10 октября 2019

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

Доступ к Request контроллера осуществляется через HttpContext, который можно установить при организации теста.

Дляпример

//Arrange
var request = new Mock<HttpRequest>();
request.Setup(x => x.Scheme).Returns("http");
request.Setup(x => x.Host).Returns(HostString.FromUriComponent("http://localhost:8080"));
request.Setup(x => x.PathBase).Returns(PathString.FromUriComponent("/api"));

var httpContext = Mock.Of<HttpContext>(_ => 
    _.Request == request.Object
);

//Controller needs a controller context 
var controllerContext = new ControllerContext() {
    HttpContext = httpContext,
};
//assign context to controller
var controller = new SomeController(){
    ControllerContext = controllerContext,
};

String expected = "expected value here";

//Act
String actual = await controller.SomeMethodPost();


//Assert
Assert.AreEqual(expected, actual);

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