c# - API ASP.NET Core 中的单元测试
问题描述
我想对我的所有方法进行一些单元测试(DELETE,PUT,POST ETC ..),但我不知道如何在单元中实例化我的类,现在我在单元类中有这个:
//Arrange
var mockRepo = new Mock<IRebelRepository>();
var controller = new RebelsController(mockRepo.Object);
//Act
var rebel = controller.Delete(2);
但现在我想检查 id 是否正确或没有观察我的 API 的响应(OK 或 BadResponse)
public ActionResult<Rebel> Delete(int id)
{
_logger.LogInformation("Start of RebelsController.Delete()");
var result = new ApiResult();
ActionResult response = null;
_logger.LogDebug($"Trying to delete rebel ID: {id}");
try
{
if (!ModelState.IsValid)
{
_logger.LogWarning("There was a problem deleting rebel, invalid data");
result.Message = "Invalid rebel information.";
result.IsError = true;
response = BadRequest(result);
}
else
{
if (id > 0)
{
var filteredRebel = _rebelRepository.GetRebelById(id);
if (filteredRebel == null)
{
_logger.LogWarning($"The rebel {id} was not found");
result.Message = $"The rebel with id {id} has not been found";
result.IsError = true;
response = BadRequest(result);
}
else
{
_rebelRepository.DeleteRebel(filteredRebel);
result.Message = "Rebel deleted correctly";
_logger.LogDebug($"Rebel {id} sucessfully deleted");
response = Ok(result);
}
}
}
}catch(Exception ex)
{
_logger.LogError("An error occurred while Deleted method was running, error :" + ex.Message);
result.Message = "Error on Delete";
result.IsError = true;
response = BadRequest(result);
}
_logger.LogInformation("End of RebelsController.Delete()");
return response;
}
如何在 API 中进行单元测试?
解决方案
因为您response
依赖于从 返回的 rebel GetRebelById
,因此您应该在使用测试 ID 调用此函数时设置预期结果,例如
var mockRepo = new Mock<IRebelRepository>();
var testId = 2;
mockRepo.Setup(r => r.GetRebelById(testId)).Returns(new Rebel {Id = testId});
var controller = new RebelsController(mockRepo.Object);
var result = controller.Delete(testId);
var actionResult = result.Result;
Assert.IsType<OkObjectResult>(actionResult);
var apiResult = (actionResult as OkObjectResult).Value as ApiResult;
Assert.NotNull(apiResult);
Assert.Equal("Rebel deleted correctly", apiResult.Message);
// should put in another test
var notFoundId = 500;
var result2 = controller.Delete(notFoundId);
var actionResult2 = result2.Result;
Assert.IsType<BadRequestObjectResult>(actionResult2);
推荐阅读
- matlab - 制作颜色条刻度线标签上方和下方的字符串,删除刻度线 - Matlab
- jestjs - 如何防止开玩笑在摘要中显示失败测试详细信息
- php - 创建 php 键和值数组
- python - Healpy query_polygon RuntimeError:未知异常
- php - 尝试将列的内容设置为变量时出现错误“无法将对象用作数组”
- java - 如何在使用 ObjectMapper 转换为 Json 时将 POJO 的 String 变量转换为 Integer?
- java - 如何从 Dropwizard,Hibernate 中的线程更新实体
- r - 如何从googlespread表R中删除行
- asp.net - 我可以从 4.6.1 Web 应用程序调用 .NET 4.7.1 DLL 吗?
- python-3.x - 无法在目录中导入另一个 python 文件