2013-10-07 1 views
0

내 플레이 응용 프로그램이 장기 실행 계산을 처리하는 akka 배우를 사용하는 akka 배우와 컨트롤러의 상호 작용을 재생 : 나는 일이 제대로 작동하는지 테스트하기 위해 노력하고테스트

class MyController(myActor : ActorRef) extends Controller{ 
    def doStuff = Action { implicit request => 

    val response : Future[Any] = myActor ? DoStuff 

    Async{ 
     response.map{   
     str : String => Ok(str) 
     } 
    } 
    } 
} 

. 액터가 제대로 작동하는지 확인하기위한 테스트를 별도로하고 컨트롤러가 올바른 msg를 액터로 보내는 지 확인하려고합니다. 나의 현재의 접근 방식은 다음과 같은 종류의 경우 : doStuff 조치가 호출 될 때

class MyControllerSpec extends Specification{ 
    "MyController" should { 

    object DummyActor extends Actor{ 
     def receive = { 
     case _ =>() 
     } 
    } 

    "do stuff properly" >> { 
     val probe = TestProbe()(Akka.system) 
     val test = new controllers.MyController(Akka.system.actorOf(Props(DummyActor)) 
     val result = test.doStuff(FakeRequest()) 
     probe.expectMsg(SomeMsg) 
    } 
    } 
} 

컨트롤러는 배우에 전달 된 메시지를 보낼 것입니다. 올바른 msg가 전송되었는지 확인하려고합니다.

필자는 test.doStuff가 동기식으로 실행되며 더미 액터가 아무 것도 보내지 않을 때 시간 초과한다고 생각합니다. expectMsg는 doStuff 호출이 반환되고 SomeMsg가 이미 전송 될 때까지 시작되지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?

답변

1

더미 액터 구현이 아닌 컨트롤러에 프로브를 전달하고 싶지 않은 경우 프로브에 전송할 방법은 무엇입니까?

+0

정확합니다. 특별한 액터 대신 프로브를 사용하도록 코드를 변경하면 실수를했습니다. 거짓 배우는 필요하지 않습니다. 이제 테스트가 작동합니다. 귀하의 답변을 수락하고 싶습니다만, 왜 이것이 효과가 있는지에 대한 설명을 추가하면 좋을 것입니다. doStuff에 대한 호출이 실제로 질문에서 말한 것과 달리 비동기 적으로 실행됩니까? msg를 곧 보내면이 테스트를 실패 할 수 있습니까? 감사. – mushroom

+0

Akka 테스트 라이브러리에 대한 제 이해는 호출하는 스레드에서 실행되는 디스패처로 액터 시스템을 실행하므로 "액터! 메시지"로 전송하면 실제로 차단되어 완료된 미래가 반환됩니다. – johanandren

+0

두 번째 생각에 나는 당신의 테스트가 akka 테스트 (TestBase 등) 테스트를 사용하지 않고 프로브 만 사용한다는 것을 알게되었습니다. 그래서 그 대답을 수정하려면 probe.expectMessage가 기본 시간 초과로 차단되고 메시지가 도착하지 않은 경우 실패합니다. 원하는 경우 다른 시간 초과 값을 지정할 수 있습니다. – johanandren