2012-11-16 17 views
8

Sto tentando di registrare tutti i messaggi ricevuti da da un TestKit TestProbe, che si sta dimostrando piuttosto difficile. Sono a conoscenza della sezione Actor Logging dei documenti in cui si dice che si dovrebbe usare l'opzione debug.receive in combinazione con un blocco LogginReceive. Questo tuttavia non funziona quando non ho il controllo dell'attuazione dell'attore.Registrazione di tutti i messaggi inviati ad Akka TestKit TestProbe

L'unica idea che avevo era la creazione di sottoclassi akka.testkit.TestActor utilizzare un LoggingReceive e poi sottoclasse TestKit per renderlo creare istanze di mia TestActor sottoclasse invece, ma che non ha funzionato perché la maggior parte la funzionalità v'è privato alla akka namespace (e per buona ragione, suppongo).

risposta

4

Scusa, all'inizio la mia domanda è leggermente sbagliata, quindi ecco il mio approccio.

Creare un attore involucro, che registra i messaggi:

class LoggingActor(fac: => Actor) extends Actor { 

    val underlying = context.system.actorOf(Props(fac)) 

    def receive = { 
    LoggingReceive { 
     case x ⇒ underlying.tell(x, sender) 
    } 
    } 
} 

e poi basta creare il TestActorRef con il vostro attore avvolto nel LoggingActor:

val echo = TestActorRef(new LoggingActor(new FooActor)) 

    echo ! "hello world" 
+0

Ci proverò, grazie :) – fresskoma

11

C'è una (probabilmente sorprendentemente) semplice risposta:

probe.setAutoPilot(new TestActor.AutoPilot { 
    def run(sender: ActorRef, msg: Any) = { 
    log.debug("whatever") 
    this 
    } 
}) 
+1

forse più semplice, ma in qualche modo criptico. Cos'è un Pilota automatico? Il doc è silenzioso su questo. – Mortimer

+0

AutoPilot è in documenti ora, fyi. Non è il concetto più semplice, ma il codice precedente è piuttosto semplice e fa il trucco (registro solo i valori di mittente e msg invece di "qualunque cosa" letterale, ovviamente). – jm0

5

Utilizzo della risposta di Ronald I wro TE questo per avere un modo più semplice per definire le mie sonde:

object LoggingTestProbe { 
    def apply()(implicit system: ActorSystem) : TestProbe = { 
    val probe = TestProbe() 
    probe.setAutoPilot(new TestActor.AutoPilot { 
     def run(sender: ActorRef, msg: Any) = { 
     val other = sender.path 
     val me = probe.ref.path 
     system.log.debug(s"$me received $msg from $other") 
     this 
     } 
    }) 
    probe 
    } 
} 

Avendo questo definisco i miei sonde utilizzando LoggingTestProbe() invece di TestProbe().

Sono nuovo di Scala, quindi potrebbe non essere ottimale ma funziona perfettamente per me.

Problemi correlati