2016-07-06 7 views
2

나는이 가이드의 예를 사용하여 스프레이의 ExceptionHandler를 시도하고있다 :ExceptionHandler가 스프레이 테스트 키트와 함께 작동하지 않습니까?

trait MyService extends HttpService { 

    val myRoute = 
    path("") { 
     get { 
     complete { 
      throw new ArithmeticException("Oops, I failed!") 
      "Hello World" 
     } 
     } 
    } 
} 

나는 곱슬 요청을 한 경우, 그것은 반환 : 나는 의도적으로이 같은 경로에 ArithmeticException을 던져 http://spray.io/documentation/1.2.2/spray-routing/key-concepts/exception-handling/

class MyServiceActor extends Actor with MyService { 

    def actorRefFactory = context 

    def receive = runRoute(handleExceptions(myExceptionHandler)(myRoute)) 

    implicit def myExceptionHandler(implicit log: LoggingContext) = 
    ExceptionHandler { 
     case e: ArithmeticException => 
     requestUri { uri => 
      complete(InternalServerError, "Bad numbers, bad result!!!") 
     } 
    } 
} 

오류 메시지는 Bad numbers, bad result!!!입니다. 그러나 Specs2 + spray testkit으로 테스트 할 때 올바른 오류 메시지를 반환하지 않고 기본 500 코드 오류 메시지 There was an internal server error을 반환합니다. sealRoute을 사용해도 도움이되지 않습니다.

"Test" in { 
    Get() ~> sealRoute(myRoute) ~> check { 
    println(responseAs[String]) // Always print `There was an internal server error.` 
    ok 
    } 
} 

그리고 콘솔에

, 나는 오류 추적을 볼 것입니다 :
[ERROR] [07/07/2016 00:31:24.661] [specs2.DefaultExecutionStrategy-1] [ActorSystem(com-example-MyServiceSpec)] Error during processing of request HttpRequest(GET,http://example.com/,List(),Empty,HTTP/1.1) 
java.lang.ArithmeticException: Oops, I failed! 
     at com.example.MyService$$anonfun$1.apply(MyService.scala:62) 
     at com.example.MyService$$anonfun$1.apply(MyService.scala:61) 
     at spray.routing.directives.RouteDirectives$$anonfun$complete$1$$anon$3.apply(RouteDirectives.scala:49) 
     at spray.routing.directives.RouteDirectives$$anonfun$complete$1$$anon$3.apply(RouteDirectives.scala:48) 
     at spray.routing.directives.BasicDirectives$$anonfun$mapRequestContext$1$$anonfun$apply$1.apply(BasicDirectives.scala:30) 
     ... 

은 내가 myExceptionHandler에에 println 명령을 넣어 결코 실행되지 얻을 myExceptionHandler을 발견했다.

누구나 왜 작동하지 않는지 알 수 있습니까? 여기에 설명 된대로 예외 핸들러가 암시 적으로 해결되기 때문에

+0

큰 질문입니다! 소화 할 수있는 예제로 분류 해 주셔서 감사합니다. 나는 비슷한 문제를 두 번 만났다. 이 대답은 마침내 나를 도왔습니다 :) – stholzm

답변

0

은 분명히 sealRoute는 충분하지 않습니다 : http://spray.io/documentation/1.2.4/spray-testkit/ 귀하의 경우

MyServiceActor 예외 핸들러를 가지고 있지만, 테스트 케이스에 그렇게 직접 MyService/myRoute를 사용 예외 처리기가 선택되지 않습니다.

이 문서 페이지가 유용 : http://spray.io/documentation/1.2.4/spray-routing/key-concepts/exception-handling/

이 솔루션은 테스트 케이스의 범위 에 암시 ExceptionHandler을 가지고하는 것입니다. 따라서이 예에서 :

"Test" in { 
    implicit val testExceptionHandler = ExceptionHandler { 
    case e: ArithmeticException => 
     requestUri { uri => 
     complete(InternalServerError, "Bad numbers, bad result!!!") 
     } 
    } 
    Get() ~> sealRoute(myRoute) ~> check { 
    println(responseAs[String]) 
    ok 
    } 
} 

효과가 있지만 물론 복제가 너무 우아하지 않습니다. 어쩌면 테스트에서 MyServiceActor의 예외 처리기에 액세스하여 프로덕션 코드를 다시 사용할 수 있습니다. 나는 모든 테스트가 상속받은 기본 클래스에 testExceptionHandler을 넣었습니다.