XUnit测试Web API:如何断言404(NotFound)状态码
解决Web API XUnit测试中404状态码的断言问题
嘿,刚接触XUnit测试Web API的话,这个404断言的问题其实很容易搞定!我来一步步教你修改测试代码:
首先,ASP.NET Core控制器返回的IActionResult是一个基类,你需要先把响应转换成具体的NotFoundResult(或者带内容的NotFoundObjectResult),才能对状态码做断言。下面是完整的测试代码示例:
[Fact] public async Task getBooksById_NullInput_Notfound() { //Arrange var mockConfig = new Mock<IConfiguration>(); var controller = new BookController(mockConfig.Object); //Act var response = await controller.GetBooksById(null); //Assert // 第一步:确认响应是NotFoundResult类型(如果返回带内容的用NotFoundObjectResult) var notFoundResult = Assert.IsType<NotFoundResult>(response); // 第二步:断言状态码为404,用框架常量更规范 Assert.Equal(StatusCodes.Status404NotFound, notFoundResult.StatusCode); }
额外说明:
- 如果你的
GetBooksById方法是返回带自定义内容的404(比如return NotFound("书籍ID不能为空")),那你需要把断言改成针对NotFoundObjectResult:var notFoundObjResult = Assert.IsType<NotFoundObjectResult>(response); Assert.Equal(StatusCodes.Status404NotFound, notFoundObjResult.StatusCode); // 还可以额外断言返回的提示内容 Assert.Equal("书籍ID不能为空", notFoundObjResult.Value); - 用
StatusCodes.Status404NotFound这个框架提供的常量,比直接写数字404更安全,避免拼写错误,也更符合代码规范。 - 如果你不确定返回的具体类型,可以先在调试模式下查看
response的实际类型,再调整断言的目标类型。
内容的提问来源于stack exchange,提问作者superninja
相关产品推荐
相关产品推荐

