#scala #akka #testkit #actorsystem
#scala #akka #testkit #actorsystem
Вопрос:
У меня есть родительский актер, который создает дочернего актера, и дочерний актер приветствует родителя каждую минуту, как показано ниже
class MasterActor extends Actor with ActorLogging {
override def receive: Receive = {
case "Greet" =>
print("Hey child!!")
case "CreateChild" =>
context.actorOf(Props[ChildActor])
}
}
class ChildActor extends Actor with ActorLogging {
import context.dispatcher
override def preStart(): Unit = {
super.preStart()
context.system.scheduler.schedule(Duration("1 minutes").asInstanceOf[FiniteDuration],
Duration("1 minutes").asInstanceOf[FiniteDuration], context.parent, "Greet")
}
override def receive: Receive = {
case _ =>
print("child receives something")
}
}
Я новичок в системе actor, как я могу протестировать сценарий расписания с помощью TestKit?
Я попробовал что-то вроде приведенного ниже в моем тесте, но это не работает
"Master actor" should {
"receive a Greet message every minute" in {
val probe = TestProbe
val actor = system.actorOf(Props(new Child() {
import context.dispatcher
override def preStart() =
context.system.scheduler.scheduleOnce(Duration("1 seconds").asInstanceOf[FiniteDuration], probe.ref, "Greet")
}))
probe.expectMsg("Greet")
}
}
Ответ №1:
Вы можете прочитать об этом в разделе «Утверждения о времени» в разделе «Тестирование документов akka». Есть within
функция, которая должна вам помочь.
Например, вы можете попробовать:
"Master actor" should {
"receive a Greet message every minute" in {
within(62 seconds) {
val probe = TestProbe
val actor = system.actorOf(Props[Child])
probe.expectMsg("Greet")
}
}
}
Что бы я сделал, чтобы не ждать так долго, так это установить тайм-аут задержки в конфигурации и изменить его на несколько миллиметров в тестовом сценарии.