我的 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 才会开始。我怎么解决这个问题?