无需字面数字,如何更简洁测试ASP.NET Core控制器响应状态码?
解决方案:用ASP.NET Core内置的
StatusCodes静态类 ASP.NET Core官方已经在Microsoft.AspNetCore.Http命名空间下提供了预定义的静态状态码常量,完全不用自己手动枚举,直接用官方维护的常量就行,既省事又不会出错。
具体用法
- 先引用
Microsoft.AspNetCore.Http命名空间 - 把测试里的硬编码数字换成
StatusCodes.StatusXXX格式的常量:
修改后的测试代码:
using Microsoft.AspNetCore.Http; using Xunit; [Fact] public void TestGetItemByIdNotFound() { var response = controller.GetItemById(1); // 无对应ItemId的场景 var result = Assert.IsType<NotFoundResult>(response); Assert.Equal(StatusCodes.Status404NotFound, result!.StatusCode); }
额外优化:直接断言结果类型(可选)
其实你已经通过Assert.IsType<NotFoundResult>确认了结果类型,可以不用再断言状态码——因为NotFoundResult的StatusCode是框架固定好的404,ASP.NET Core已经保证了这一点,这样测试代码会更简洁:
[Fact] public void TestGetItemByIdNotFound() { var response = controller.GetItemById(1); // 只要断言结果是NotFoundResult类型,就等于验证了返回404状态 Assert.IsType<NotFoundResult>(response); }
常见状态码常量示例
官方的StatusCodes类覆盖了所有标准HTTP状态码,举几个常用的:
StatusCodes.Status200OK(对应200)StatusCodes.Status400BadRequest(对应400)StatusCodes.Status500InternalServerError(对应500)
这样既不用记状态码数字,也不用自己维护枚举,完全依赖官方实现,是最简洁可靠的方式。
内容的提问来源于stack exchange,提问作者Dmitry S.
相关产品推荐
相关产品推荐

