c# - 单元测试 .Net CORE 2.0 WebAPI - 带有文本流主体(非模型)的模拟(MOQ)HTTP POST
问题描述
我正在尝试对我的 .Net CORE 2.0 API 控制器的 HTTP POST 方法进行单元测试,该方法读取数据......不能使用“模型”类型的方法作为传入的流原始数据。
这是控制器方法的基础知识。
[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 请求。
谷歌尚未产生任何有利的结果,因为它们都假设一个完全定义的模型,而不是文本流
解决方案
您已经使用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));
}
推荐阅读
- android - 5分钟计数器如何使进度条顺利进行?
- php - 大规模的一对多性能
- php - 是否可以将 PHP 数组转换为 POST 请求?
- docker - 如何使用新的 docker 镜像而不是旧的?
- active-directory - ASP.NET 样板:Active Directory Ldap 身份验证无效的用户名或密码
- python - 正则表达式:仅提取数字直到第一个空格
- sublimetext3 - 使光标在崇高的文本中更明显?
- python - 如何从 Pytorch DataLoader 获取列表类型?
- node.js - 对于具有本地化角度文件夹的节点 api,nginx 返回 405 方法不允许
- python - Django - 将ajax请求移动到不同的应用程序后方法不允许错误