0

俳優の章のakka の本で3。メッセージ イベントを使用して、サイレント アクターの状態をテストします。

アクターは次のとおりです。

object SilentActorProtocol {
 case class SilentMessage(data: String)
 case class GetState(receiver: ActorRef)
}
class SilentActor extends Actor {
 import SilentActorProtocol._
 var internalState = Vector[String]()
 def receive = {
   case SilentMessage(data) =>
     internalState = internalState :+ data
     case GetState(receiver) => receiver ! internalState
   }
}

次のようにコードをテストします。

"change internal state when it receives a message, multi" in {
 import SilentActorProtocol._
 val silentActor = system.actorOf(Props[SilentActor], "s3")
 silentActor ! SilentMessage("whisper1")
 silentActor ! SilentMessage("whisper2")
 silentActor ! GetState(testActor)
 expectMsg(Vector("whisper1", "whisper2"))
}

テスト コード内で、GetState を使用して上記のSilentMessageイベントの結果を取得する理由。結果をまっすぐに取得し
ないのはなぜですか?slientActor.internalState

アップデート

一部の友人は私の問題を誤解しているようです. 詳細については, 本は言った

変数を使用internalStateすると同時実行性の問題が発生するため、直接GetState使用するのではなく、アクターの内部状態を取得するためにイベント テル アクターを使用する必要があります。internalState

GetState同時実行の問題が発生する理由と、使用によって問題を解決できる理由がわかりません

説明

slientActor.internalState内部変数をそのまま取得することはできません。インスタンスを使用silentActor.underlyingActor.internalStateすると取得できます。ひどい質問で申し訳ありません。

4

1 に答える 1

1

私があなたの質問を正しく理解していれば、答えは、テスト コードの silentActor はアクターではなく、ActorRef インスタンスであるため、参照される internalState 変数がないということです。

ActorRef で特定の変数とメソッドの単体テストを作成する場合は、ドキュメンテーション で説明されているように、(注意事項を含む) 基礎となるActor 手法を使用する必要があります。(TestActorRef のセクションを参照してください。

于 2016-07-12T05:06:11.953 に答える