c# - 单元测试 .Net CORE 2.0 WebAPI - 带有文本流正文的模拟(最小起订量)HTTP POST(非模型)

标签 c# unit-testing asp.net-core moq asp.net-core-2.0

我正在尝试对流读取数据的 .Net CORE 2.0 API Controller 的 HTTP POST 方法进行单元测试...不能使用“模型”类型的方法作为传入的流原始数据。

这里是 Controller 方法的基础。

[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 尚未得出任何令人满意的结果,因为他们都假设了一个完全定义的模型,而不是一个文本流

最佳答案

您已经使用 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));
}

关于c# - 单元测试 .Net CORE 2.0 WebAPI - 带有文本流正文的模拟(最小起订量)HTTP POST(非模型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52949573/

相关文章:

c# - Asp Core Web App,使用 Azure Devops 部署时为 404,通过 Visual studio 发布时为 200

c# - 如何使用 powershell 为构建服务器构建、发布 ASP.NET 核心项目?

c# - 如何从 WebAPI 响应 json 中删除 EF 的导航属性空数组?

c# - 如何在TreeView中选择某个子节点,C#

c# - 将工作簿名称传递到 For 循环 C#

scala - sbt 集成测试在测试失败时返回退出代码 0

c# - 如何在 ASP.NET Core 中测试 https 重定向?

c# - 如何从 KeyDown 方法中使用 PaintEventArgs 调用方法

c# - 最小起订量与 Unity 容器单元测试

xml - 在单元测试中验证 XML 的最佳方法是什么?