2015-03-05 2 views
2

Я хочу проверить, что preStart() создает правильное дерево актеров (исправьте меня, если я выбрал неправильное место для создания дерева актеров).Создание тестовых актеров в akka hooks (preStart)

class Central extends Actor { 

    var summer : ActorRef = _ 

    override def preStart() = { 
    val printerProps = Props[Printer] 
    val printer = context.actorOf(printerProps, "printer") 
    val summerProps = Props(new Summer(printer)) 
    summer = context.actorOf(summerProps, "summer") 
    } 

    override def receive = { 
    case msg => 
    } 
} 

Для полной картины:

class Printer extends Actor { 
    override def receive = { 
    case msg => println(msg) 
    } 
} 

class Summer(printer: ActorRef) extends Actor { 
    override def receive = { 
    case (x: Int, y: Int) => 
     printer ! x + y 
    } 
} 

Любая идея, как сделать четкий тест этого?

Этот ответ https://stackoverflow.com/a/18877040/1768378 близок к тому, что я ищу. Но я думаю, что код изменения, потому что причина теста - плохая идея.

Возможно, кто-то знает лучшее решение.

ответ

1

Если вы хотите протестировать только творение, вы также можете, с вашего теста, получить от ActorSystem актерский отбор, содержащий всех детей вашего центрального актера (центральный/*).

После этого отправьте сообщение идентификации (специальное сообщение akka) на весь выбор и дождитесь ответов, проверяя, совпадают ли они. Не нужно вводить код в ваших актеров.

0

Отрывок, который основан на ответ Диего Martinoia:

"The Central actor" should { 
    "Create Summer" in { 
     import scala.concurrent.duration._ 
     implicit val timeout = Timeout(3 seconds) 

     val central = system.actorOf(Props[Central], "central") 

     val summerSelection = system.actorSelection("user/central/summer") 
     val summerRef = Await.result(summerSelection.resolveOne(), 3 seconds) 
    } 
} 
+0

Обратите внимание, что, в случае, если вы не получите ответ в течение 3-х секунд, это не является гарантией того, что не была создана ваша актер. Но, возможно, у вас есть еще одна проблема, если она реагирует так медленно. –

+0

Да, это правильно. И ошибка теста - это правильный сигнал. –