Akka: протестируйте запланированных участников с помощью Testkit

#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")
  }
 }
}
  

Что бы я сделал, чтобы не ждать так долго, так это установить тайм-аут задержки в конфигурации и изменить его на несколько миллиметров в тестовом сценарии.