Xunit测试IHttpActionResult web api 2函数用于自定义消息

本文关键字:函数 用于 自定义消息 api 测试 IHttpActionResult web Xunit | 更新日期: 2023-09-27 18:03:13

我重构了我的web api函数(以利用web api 2的变化),但不知道如何重构我的xUnit测试,测试自定义异常消息。

我重构了这个:

[Route("resetpassword"), HttpPost]
public HttpResponseMessage ResetPassword([FromBody] ResetPasswordRequest request)
{
  try
  {
    var resetPermission = _userPasswordResetRequestRepository.GetByToken(request.Token);
    if (resetPermission.Expires < DateTimeOffset.Now)
      throw new Exception("Token expired");
    _userPasswordRepository.SetPassword(resetPermission.UserId, request.Password);
    return Request.CreateResponse(HttpStatusCode.OK, "Request received");
  }
  catch (Exception ex)
  {
    return Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message);
  }
}

到此(返回类型更改为IHttpActionResult,返回语句更改):

[Route("resetpassword"), HttpPost]
public IHttpActionResult ResetPassword([FromBody] ResetPasswordRequest request)
{
  try
  {
    var resetPermission = _userPasswordResetRequestRepository.GetByToken(request.Token);
    if (resetPermission.Expires < DateTimeOffset.Now)
      throw new Exception("Token expired");
    _userPasswordRepository.SetPassword(resetPermission.UserId, request.Password);
    return Ok("Request received");
  }
  catch (Exception ex)
  {
    return InternalServerError(ex);
  }
}

我失败的xUnit测试:

[Theory]
[InlineData(-10, true)]
[InlineData(10, false)]
public void IfTokenExpired_ShouldReturnError(int expireOffsetMinutes, bool shouldBeExpired)
{
  ...
  // Assert
  Assert.Equal(HttpStatusCode.OK, response.StatusCode); // <-- fail
  if (shouldBeExpired)
    Assert.Equal("Token expired.", response.ContentString()); // <-- fail
}

如何测试:

  • 为一个正确的标题?Assert.Equal (HttpStatusCode。好的,response.StatusCode);
  • 在自定义异常消息中的特定字符串?断言。= ("Token过期",response.ContentString());

Xunit测试IHttpActionResult web api 2函数用于自定义消息

我在看这个答案:当它返回IHttpActionResult时,我如何单元测试web api操作方法?

然而,返回Ok("Request received");返回OkNegotiatedContentResult而不是OkResult

:

Assert.Equal(HttpStatusCode.OK, response.StatusCode);
Assert.Equal("Token expired", response.ContentString())

我变成了这样:

Assert.IsType<OkNegotiatedContentResult<string>>(response);
Assert.Equal(((OkNegotiatedContentResult<string>)response).Content, "Token expired");