2016-10-18 3 views
0

После моего other question, у меня есть UDP сервера актер следующим образом:Как протестировать аккорского актера, который порождает детей-актеров во время исполнения?

class Listener(addr: InetSocketAddress) extends Actor { 
    import context.system 
    IO(Udp) ! Udp.Bind(self, addr) 

    def spawnChild(remote): ActorRef = { 
    //Check if child already exist 
    context.actorOf(Props[Worker]) 
    } 

    def receive = { 
    case Udp.Bound(local) => 
     context.become(ready(sender())) 
    } 

    def ready(socket: ActorRef): Receive = { 
    case Udp.Received(data, remote) => 
     val worker = spawnChild(remote) 
     worker ! data // forward data directly to child 
    case Udp.Unbind => socket ! Udp.Unbind 
    case Udp.Unbound => context.stop(self) 
    } 
} 

я создаю детей актеров, основанные на том, где данные посылки из. Причиной этого является сохранение некоторого внутреннего состояния дочерним актором. Внутренние состояния включают в последнее время подключения, общее количество передаваемого пакета и т.д.

Я хочу установку TestProbes, чтобы проверить, что

  • данные remoteA пересылается TestProbeA
  • данные remoteB пересылаются TestProbeB
  • данные remoteA не пересылается на TestProbeB

Я прочитал раздел Using multiple probes. Однако в моей ситуации именно родительский актер несет ответственность за создание детей.

Как я должен писать свои спецификации в этом случае? Или, может быть, как я должен реорганизовать мой код, чтобы он был более удобным для тестирования?

ответ

2

Документация Акко есть раздел, описывающий несколько способов, которые могут быть достигнуты: Testing parent child relationships

На работе мы успешно использует подход объясняется в экстернализовать ребенок делает из родительского. На практике это означает, что ваш родитель-актер принимает параметр «дочерняя фабрика» либо во время инициализации (или через сообщение).

В тестовом коде вы можете предоставить «поддельную» фабрику, которая вернет тестовый зонд вместо чистого актера.

+0

Благодарим вас за ответ. Я прочитаю этот раздел и опубликую мои результаты здесь. – user2829759