1

私の 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 は開始されません。どうすればこの問題を解決できますか?

4

1 に答える 1