我重构了我的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());
我在看这个答案:当它返回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");