WebAPI控制器单元测试:如何验证非法参数的错误返回?
解决控制器异常处理与单元测试调整问题
一、控制器代码修改:将异常转换为HTTP错误响应
目前你的控制器在catch块里没有对ArgumentException做针对性处理,导致直接抛出原始异常,客户端收到的是未处理的服务器错误而非合法的参数错误响应。我们需要在catch中区分异常类型,返回对应的HTTP状态码:
public IHttpActionResult GetAttractions([FromUri] SearchAttractionRequest request) { try { var requestParameterType = request.RequestType(); var searchResultModel = _attractionService.GetAttractions(request); return TransformListToResult(searchResultModel.Results, request.PerPage, searchResultModel.TotalItemCount, searchResultModel.GeneratedQuery); } catch (ArgumentException ex) { // 参数非法对应HTTP 400 Bad Request return BadRequest(ex.Message); } catch (Exception ex) { // 其他未知异常返回HTTP 500 Internal Server Error return InternalServerError(ex); } }
这样修改后,当request.RequestType()抛出参数异常时,控制器会返回标准的400响应,客户端能清晰收到参数错误的提示。
二、单元测试调整:验证返回的HTTP响应结果
原来的测试期望抛出HttpResponseException,但现在控制器已经处理了异常并返回IHttpActionResult,所以需要调整测试逻辑,验证返回结果的类型和状态码:
[Test] public void Given_Mixed_Parameters_Expect_BadRequestResponse() { // Arrange var invalidQuery = new SearchAttractionRequest { Category = Guid.NewGuid().ToString() + "|a catgeory|" + Guid.NewGuid().ToString(), Genre = "", Region = "" }; var attractionServiceMock = Mock.Of<IAttractionService>(); var sut = new AttractionsApiController(attractionServiceMock); // Act var result = sut.GetAttractions(invalidQuery) as BadRequestErrorMessageResult; // Assert // 验证返回结果是BadRequest类型 result.Should().NotBeNull(); // 验证错误信息(可选,根据你的RequestType()抛出的具体信息调整) result.Message.Should().Contain("无效的参数格式"); // 进一步验证HTTP状态码(如果需要) var response = result.ExecuteAsync(CancellationToken.None).Result; response.StatusCode.Should().Be(HttpStatusCode.BadRequest); }
关键说明
为什么原来的测试报错?
未修改控制器时,ArgumentException会直接从控制器方法抛出,单元测试直接调用方法会捕获到原始异常,而非HttpResponseException(HttpResponseException是Web API框架在处理未捕获异常时生成的,但单元测试直接调用方法不会触发框架的异常处理流程)。是否需要用
OkNegotiatedContentResult?
不需要,因为这是错误响应场景,我们需要用对应错误状态码的Result类型,比如BadRequestErrorMessageResult(对应400)、InternalServerErrorResult(对应500)等。如果是成功响应才会用到OkNegotiatedContentResult这类返回数据的结果类型。
内容的提问来源于stack exchange,提问作者Ismail
相关产品推荐
相关产品推荐

