2015-02-03 3 views
0

단위 필터 예외를 테스트하려고합니다. 예외를 확인할 수는 있지만 단위 테스트에서 유효성을 검사하는 예외 메시지를 찾지 못하는 것 같습니다. 여기에 내 코드 ...단위 테스트 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);

시계 창에서 보려고하면 응답에서 "내 시간 초과 메시지"를 찾지 못하는 것 같습니다.

UPDATE :

actionContext.Response.ReasonPhrase = "요청 시간 초과"

ex.Message = "내 시간 제한 메시지"

+0

당신은 당신의 응답 클래스의 일부 코드를 표시 할 수 있습니다 : 여기

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

, responseContent 지금 있었다 읽은 후 ... 내가 무슨 짓을했는지? – CalebB

+0

또한 Microsoft의 [Asser.Equals] (https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.assert.equals.aspx) 문서에 따라 문제가 발생할 수 있습니다. Assert .Equals는 문자열이 아닌 객체를 비교합니다. 나는 이것에 대해 잘못 될 수는 있지만 문자열을 비교하려는 경우'actionContext.Response.ReasonPhrase.Equals (ex.Message)'와 같은 것을 할 수 있지만 내 코드 스 니펫에 표시된 Assert.Equals 및 String.Equals 메소드는 모두 두 가지 비교 방법은 실제로 값을 설정하지 않습니다. – CalebB

+0

첫 번째 질문을 이해하면 Response 클래스 (context.Response = ...)는 기본 C# 클래스입니다. 당신의 질문을 잘못 듣고 있습니까? – BCarlson

답변

0

CreateErrorResponse의 메시지 부분은 당신이 속성 아니다 가치를 얻으려면 내용을 읽어야합니다. 그것은 당신의 ReasonPhrase 회원에 관련된

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