Модульное тестирование .Net CORE 2.0 WebAPI - пробный (MOQ) HTTP POST с телом текстового потока (не модель) - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь выполнить модульное тестирование моего метода HTTP POST моего контроллера API .Net CORE 2.0, который выполняет потоковое чтение данных ... Невозможно использовать подход типа "модель" в качестве исходных данных входящего потока.

Вот основы метода контроллера.

[HttpPost()]
[Authorize(Roles = "contributor")]
public async Task<IActionResult> SubmitReport()
{
    IActionResult result = null;
    _logger.LogInformation("POST Request");

    var buffer = new byte[this.Request.ContentLength.Value];

    await this.Request.Body.ReadAsync(buffer, 0, buffer.Length);
    string content = System.Text.Encoding.UTF8.GetString(buffer);

    // Do something with the 'content'

    return (Accepted());  // Assuming all was OK
}

А вот мой юнит-тест ... или, точнее, насколько я могу получить ..

[TestMethod]
public void eFormController_SubmitReport_MockService_ExpectHttpStatusAccepted()
{
    var mockContextAccessor = new Mock<IHttpContextAccessor>();
    var context = new DefaultHttpContext();
    mockContextAccessor.Setup(x => x.HttpContext).Returns(context);

    var mockLogger = new Mock<ILogger<object>>();
    var ctrl = new Controllers.eFormsController();

    var result = ctrl.SubmitReport();

    Assert.IsInstanceOfType(result, typeof(Microsoft.AspNetCore.Mvc.AcceptedResult));
}

Когда я запускаю теств его нынешнем виде свойство this.Request равно null, поэтому как мне смоделировать правильный HTTP-запрос POST.

Google еще не дал каких-либо благоприятных результатов, поскольку все они предполагают полностью определенную модель, а не текстовый поток

1 Ответ

0 голосов
/ 23 октября 2018

Вы уже проделали большую часть работы, используя DefaultHttpContext.

Организовать запрос с телом (потоком) и необходимыми свойствами, чтобы тестируемый метод мог работать так, как ожидалось.

Должен быть в состоянии выполнить тест оттуда

[TestMethod]
public async Task eFormController_SubmitReport_MockService_ExpectHttpStatusAccepted() {
    //Arrange
    var data = "Hello World!!";
    var stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(data));

    var httpContext = new DefaultHttpContext();
    httpContext.Request.Body = stream;
    httpContext.Request.ContentLength = stream.Length;

    var mockLogger = new Mock<ILogger<object>>();

    var controllerContext = new ControllerContext() {
        HttpContext = httpContext,
    };

    var controller = new Controllers.eFormsController(mockLogger.Object) {
         ControllerContext = controllerContext,
    };

    //Act
    var result = await controller.SubmitReport();

    //Assert
    Assert.IsInstanceOfType(result, typeof(Microsoft.AspNetCore.Mvc.AcceptedResult));
}
...