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가 이미 전송 될 때까지 시작되지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?
정확합니다. 특별한 액터 대신 프로브를 사용하도록 코드를 변경하면 실수를했습니다. 거짓 배우는 필요하지 않습니다. 이제 테스트가 작동합니다. 귀하의 답변을 수락하고 싶습니다만, 왜 이것이 효과가 있는지에 대한 설명을 추가하면 좋을 것입니다. doStuff에 대한 호출이 실제로 질문에서 말한 것과 달리 비동기 적으로 실행됩니까? msg를 곧 보내면이 테스트를 실패 할 수 있습니까? 감사. – mushroom
Akka 테스트 라이브러리에 대한 제 이해는 호출하는 스레드에서 실행되는 디스패처로 액터 시스템을 실행하므로 "액터! 메시지"로 전송하면 실제로 차단되어 완료된 미래가 반환됩니다. – johanandren
두 번째 생각에 나는 당신의 테스트가 akka 테스트 (TestBase 등) 테스트를 사용하지 않고 프로브 만 사용한다는 것을 알게되었습니다. 그래서 그 대답을 수정하려면 probe.expectMessage가 기본 시간 초과로 차단되고 메시지가 도착하지 않은 경우 실패합니다. 원하는 경우 다른 시간 초과 값을 지정할 수 있습니다. – johanandren