1

我的 play 应用程序使用 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 是同步运行的,并且当虚拟演员不发送任何内容时会超时。直到 doStuff 调用返回并且 SomeMsg 已经发送后,expectMsg 才会开始。我怎么解决这个问题?

4

1 回答 1

2

您不是想要将探针传递给控制器​​而不是虚拟参与者实现,否则将如何将某些东西发送到探针?

于 2013-10-08T12:15:33.800 回答