【发布时间】:2023-03-31 09:02:01
【问题描述】:
一些上下文:
我正在对一个简单的MyController 进行单元测试,对于每个测试,我都断言http 响应对象是Microsoft.AspNetCore.Mvc.ObjectResult 基类或其任何派生类(如BadRequestObjectResult 或@)的特定类型987654324@.
MyController : BaseController
{
public void IActionResult> Get(...)
{
try
{
if (...) retrun BadRequest(...)
return Ok(...);
}
catch (Exception ex)
{
return StatusCode(500, ...);
}
}
例如,在每个单元测试结束时,我断言实际返回类型是 ObjectResult 和 HttpCode 为 500,或者第二个单元测试的返回类型是 BadRequestObjectResult 和 HttpCode 400:
[Test]
public void ControllerTest_WhenFail_ShouldRetrunInternalServerError()
{
...
IActionResult actual = controller.Get(...);
//Assert
AssertHttpCode<ObjectResult>(actual, 500);
}
public void ControllerTest_WhenRequestNotValid_ShouldRetrunBadRequest()
{
...
IActionResult actual = controller.Get(...);
//Assert
AssertHttpCode<BadRequestObjectResult>(actual, 400);
}
这是用于类型转换和断言StatusCode 的断言函数:
private void AssertHttpCode<T>(IActionResult actual, int httpCode) where T : ObjectResult
{
Assert.IsNotNull(actual);
T objectResult = actual as T;
Assert.AreEqual(objectResult.StatusCode, httpCode);
}
我的问题:
不是将httpCode作为每个单元测试的参数发送,我想知道是否可以解析运行时T值的ObjectResult基数的StatusCode? 所以AssertHttpCode 函数的客户端,不需要发送httpCode 作为参数,比如:
public void ControllerTest_WhenRequestNotValid_ShouldRetrunBadRequest()
{
...
IActionResult actual = controller.Get(...);
//Assert
AssertHttpCode<BadRequestObjectResult>(actual); //no 400 here, it is obvious!
}
private void AssertHttpCode<T>(IActionResult actual) where T : ObjectResult
{
Assert.IsNotNull(actual);
T objectResult = actual as T;
Assert.AreEqual(objectResult.StatusCode, **resolved_http_Code_from_T**);
}
【问题讨论】:
-
可能与问题无关,但如果你有一个全局异常处理程序和一个模型验证器(都附带 ASP.NET Core),你可能不需要任何这些
-
至于问题本身,可以查看
T的类型,BadRequestObjectResult总会有400的结果 -
嘿@CamiloTerevinto,您是否建议硬编码检查
T的类型是否为BadRequestObjectResult,然后检查它是否为400? -
@CamiloTerevinto 我更喜欢你的第一条评论!我会用的。
标签: c# unit-testing generics asp.net-core-webapi