单元测试web api的动作方法响应,而异常

本文关键字:响应 异常 方法 web api 单元测试 | 更新日期: 2023-09-27 18:11:58

我正试图为web api操作方法编写一些单元测试,而异常。在action方法

下面
[Route("{userName}/{searchCriteria}")]
[HttpGet]
public IHttpActionResult Events(string accountNumber, string searchCriteria)
{
    try
    {
        bool isInputValid = _inputValidation.IsTrackingEventInputValid(accountNumber, searchCriteria);
        if (isInputValid)
        {
            return OK ("my data");
        }
        else
        {
            throw new ArgumentException();
        }
    }
    catch (ArgumentException ae)
    {
        return new ResponseMessageResult(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ExceptionHandlingMessages.InvalidArgumentException));
    }
    catch (Exception ex)
    {
        return new ResponseMessageResult(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ExceptionHandlingMessages.InternalServerError));
    }
}

我想检查响应状态代码和响应消息,而异常发生。但问题是,一旦我的执行击中ResponseMessageResult代码,它抛出另一个ArgumentNullExceptionValue cannot be null.Parameter name: request。因为那个控件永远不会返回到我的单元测试方法。

我的单元测试方法

[TestMethod]
public void Events()
{
    _mockInputValidation.Setup(x => x.IsTrackingEventInputValid(It.IsAny<string>(), It.IsAny<string>())).Returns(false);
    //act
    IHttpActionResult actionResult = _trackingEventController.Events(string.Empty, string.Empty);
    //assert
}

我也试着放[ExpectedException(type)],但没有多大帮助

如何解决这个问题

单元测试web api的动作方法响应,而异常

重构代码,尽量避免在操作中抛出异常。让异常处理程序/过滤器处理它们(横切关注点)。如果您没有为单元测试提供适当的请求消息,则可能发生原始问题。

[Route("{userName}/{searchCriteria}")]
[HttpGet]
public IHttpActionResult Events(string accountNumber, string searchCriteria) {
    bool isInputValid = _inputValidation.IsTrackingEventInputValid(accountNumber, searchCriteria);
    if (isInputValid) {
        return Ok("my data");
    } else {
        return BadRequest(ExceptionHandlingMessages.InvalidArgumentException);
    }
}

然后对于特定的测试用例

[TestMethod]
public void IsTrackingEventInputValid_When_False_Should_Return_BadRequest() {
    //Arrange
    _mockInputValidation.Setup(x => x.IsTrackingEventInputValid(It.IsAny<string>(), It.IsAny<string>())).Returns(false);
    var expected = ExceptionHandlingMessages.InvalidArgumentException;
    //Act
    var actionResult = _trackingEventController.Events(string.Empty, string.Empty) as BadRequestErrorMessageResult;
    //Assert
    Assert.IsNotNull(actionResult);
    Assert.AreEqual(expected, actionResult.Message);
}