测试播放控制器与akka actor的交互

时间:2013-10-07 01:50:26

标签: playframework playframework-2.0 akka testkit

我的播放应用程序使用akka actor来处理长时间运行的计算:

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操作时,控制器将向传入的actor发送一条消息。我正在尝试验证是否发送了正确的消息。

我认为test.doStuff是同步运行的,当虚拟actor没有发送任何内容时会超时。在doStuff调用返回并且SomeMsg已经发送之后,expectMsg才会启动。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

不是你想把探针传递给你的控制器而不是虚拟的actor实现,如果不是这样的话怎么会被发送到探测器?