单元测试 ExceptionFilterAttribute

Unit testing ExceptionFilterAttribute

我正在尝试对我的异常过滤器代码进行单元测试。我可以验证异常,但我似乎无法在单元测试中找到要验证的异常消息。这是我的代码...

public class ExceptionHandlingAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        if (context.Exception is TimeoutException)
        {
            context.Response = context.Request.CreateErrorResponse(HttpStatusCode.RequestTimeout, context.Exception.Message);
            return;
        }
        if (context.Exception is UnauthorizedAccessException)
        {
            context.Response = context.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, context.Exception.Message);
            return;
        }

        context.Response = context.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Unable to process your request.");
    }
}

单元测试代码

[Theory, MemberData("ExceptionData")]
    public void OnExceptionTests(Exception ex, HttpStatusCode statusCode)
    {
        var request = new HttpRequestMessage();
        var actionContext = InitializeActionContext(request);
        var httpActionExectuedContext = new HttpActionExecutedContext(actionContext, ex);

        var exceptionHandlingAttribute = new ExceptionHandlingAttribute();
        exceptionHandlingAttribute.OnException(httpActionExectuedContext);
        Assert.Equal(actionContext.Response.StatusCode, statusCode);
        Assert.Equal(actionContext.Response.ReasonPhrase, ex.Message);
    }

    public static IEnumerable<object[]> ExceptionData
    {
        get
        {

            return new[]
            {
                new object[] { new TimeoutException("My timeout message."), HttpStatusCode.RequestTimeout }                   
            };
        }
    }

我的问题是:Assert.Equal(actionContext.Response.ReasonPhrase, ex.Message);

当我试图在手表 window 中查看它时,我似乎无法在响应中找到 "My Timeout message"。

更新:

actionContext.Response.ReasonPhrase = "Request Timeout"

ex.Message = "My timeout message"

CreateErrorResponse 的消息部分不是 属性,您必须阅读内容才能获取值。这是我所做的...

var responseContent = await actionContext.Response.Content.ReadAsStringAsync();

阅读后,responseContent 现在有:

{ "message" : "My timeout message." }