8

TestKit TestProbeが受信したすべてのメッセージをログに記録しようとしていますが、これはやや難しいことがわかっています。このオプションをブロックと組み合わせて使用​​する必要があると記載されているドキュメントのアクターロギングセクションを知っています。ただし、これは、アクターの実装を制御していない場合は機能しません。debug.receiveLogginReceive

私が持っていた唯一のアイデアは、サブクラスakka.testkit.TestActorを使用してLoggingReceiveサブクラスを使用し、代わりにサブクラスTestKitのインスタンスを作成することでしTestActorたが、ほとんどの機能が名前空間にプライベートであるため、それは機能しませんでしたakka(そして正当な理由があると思います)。

4

3 に答える 3

14

(おそらく驚くべきことに)簡単な答えがあります:

probe.setAutoPilot(new TestActor.AutoPilot {
  def run(sender: ActorRef, msg: Any) = {
    log.debug("whatever")
    this
  }
})
于 2012-11-21T15:20:58.827 に答える
5

ロナルドの答えを使用して、プローブを定義するためのより簡単な方法を持つためにこれを書きました:

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
  }
}

LoggingTestProbe()これを使用して、の代わりにを使用してプローブを定義しますTestProbe()

私はScalaを初めて使用するので、これは最適ではないかもしれませんが、私にとってはうまく機能します。

于 2013-12-27T19:04:07.087 に答える
4

申し訳ありませんが、最初は質問が少し間違っていたので、ここに私のアプローチがあります。

メッセージをログに記録するラッパーアクターを作成します。

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

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

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

次に、アクターを:TestActorRefでラップして作成します。LoggingActor

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

  echo ! "hello world"
于 2012-11-16T18:28:24.573 に答える