2014-12-03 3 views
0

웹 서비스를 검사하기위한 테스트 코드가 있는데 상속 된 클래스 중 일부는 HttpService (어느 것이 확실하지 않은 것)을 가져와 시험 클래스 내에서 actorRefFactory 참조를 정의해야합니다.스프레이 경로 테스트 : 왜 actorRefFactory : ActorSystem을 정의해야합니까?

더 좋은 방법이 있나요?

스칼라 2.11.4, ScalaTest 2.2.1, 1.3.2 스프레이,

class RestAPITest extends FlatSpec 
    with Matchers 
    with ScalatestRouteTest 
    with SprayJsonSupport 
    with MyRoute 
{ 
    // Without this, we get: 
    // << 
    // Error:(48, 7) class RestAPITest needs to be abstract, since method actorRefFactory in trait HttpService of type => akka.actor.ActorRefFactory is not defined 
    // << 
    // 
    def actorRefFactory: ActorSystem = system 

    ... 

답변

1

actorSystem은 Akka 액터를 기반으로하므로 스프레이가 필요합니다. 스프레이의 관용 테스트 메커니즘은 스프레이 테스트 키트 프로젝트를 사용하는 것입니다. spray-testkit 문서에서

:

REQUEST ~> ROUTE ~> check { 
    ASSERTIONS 
} 

이 템플릿 요청에서 평가되는 식입니다 :

스프레이 testkit로 구축 테스트의 기본 구조는이 (모두 대문자로 표현 자리)입니다 HttpRequest 인스턴스에 전달합니다. 두 RouteTest 특성 모두 spray-httpx Request Building 특성을 확장하므로 편리하고 간결한 요청 구성을 위해 미니 DSL에 액세스 할 수 있습니다.

ROUTE는 스프레이 경로를 평가하는 표현식입니다. 인라인을 지정하거나 서비스에 정의 된 경로 구조를 참조 할 수 있습니다.

~> 체인의 마지막 요소는 확인 호출이며, assertion 블록을 매개 변수로 사용합니다. 이 블록에서 주어진 요청을 처리 한 후 경로에 의해 생성 된 결과에 대한 요구 사항을 정의합니다. 일반적으로 정의 된 "inspector"중 하나를 사용하여 라우트 응답의 특정 요소를 검색하고 테스트 프레임 워크에서 제공하는 테스트 DSL을 사용하여 라우트 응답에 대한 어설 션을 표현합니다. 예를 들어, specs2으로, 순서대로 경로가 상태 (200) 응답 요청에 응답하는지 확인하려면 상태 관리자를 사용하여이 같은 주장 표현하는 것 :

status mustEqual 200 
+0

감사합니다. 왜 내가 이해하지 못하는 것은 ScalatestRouteTest가 이것에 대한 기본값을 제공 할 수없는 이유이며, 일반적으로 그런 것들은 스칼라의 함축을 통해 이루어집니다 (맞습니까?) 왜 여기 없습니까? 추상적 인 멤버의 이름을 짓는 것은 비 스케일의 일종의 느낌입니다. – akauppi

+0

불행히도, 나는 그 질문에 대한 좋은 대답이 없습니다. 어떤 종류의 대답을 얻으려면 메일 링리스트에 문의하는 것이 좋습니다. 내부 비즈니스를 위해 스프레이를 사용하는 또 다른 액터 시스템이있을 수 있습니다. 두 개의 ActorSystem을 가지므로 암묵적인 선언이 복잡해집니다. 저자가 일반적으로 자신의 ActorSystems로 테스트하기를 원한다고 결정한 경우도있을 수 있습니다. 코드를 파고 들지 않고서는 확실치 않습니다 ... – jxstanford

+0

정확히. 계속할 것입니다. 감사 – akauppi

-3

오류가 말했듯이 Akka 2.3.6, 당신은 배우가 HTTP 서비스에 산란을위한 actorRefFactory이 필요합니다. 그러니 계속 나아가 라.