私の play アプリケーションは 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)
}
}
}
}
私は物事が適切に機能していることをテストしようとしています。アクターが適切に動作することを確認するための別のテストがあり、ほとんどの場合、コントローラーが正しいメッセージをアクターに送信することを確認したいだけです。私の現在のアプローチは、次のようなものです。
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)
}
}
}
doStuff アクションが呼び出されると、コントローラーは渡されたアクターにメッセージを送信します。正しいメッセージが送信されていることを確認しようとしています。
test.doStuff は同期的に実行され、ダミー アクターが何も送信しないとタイムアウトになると思います。doStuff 呼び出しが戻り、SomeMsg が既に送信されるまで、expectMsg は開始されません。どうすればこの問題を解決できますか?