2016-04-14 12 views
3

私のScalaアプリケーションでは、私にはActor AとActor Bがあります。私はAにメッセージを送って、Aが適切にデータを処理していて、Bに正しいメッセージを送信しているかどうかを確認するために、アクターBにどのメッセージが送信されているかを見ることができるScalaTestのテストケースを考案したいと思います。どのようにこれをテストするでしょうか?これは私自身で料理されるまでには長い時間がかかりましたが、ほとんどの場合はうまくいくようです。ScalaとAkka - Akka Testkitを使ったシステムとしてのテストアクター

class A extends Actor { ... } 

class B extends Actor { ... } 

class C(p: TestProbe) extends B { 
    override def receive = { 
    LoggingReceive { 
     case x => 
     println(x.toString) 
     p.ref ! x 
    } 
    } 
} 

case class MsgToB(...) 

// Spec class which extends TestKit 
"A" should { 
    "send the right message to B" { 
    val p = TestProbe() 
    val a = TestActorRef[A] 
    val c = TestActorRef(Props(new C(p))) 

    // Assume A has a reference to C. Not shown here. 
    a ! msg 
    // Assert messages 
    p.expectMsgType[MsgToB] 
    } 
} 

これはこれを行うための最良の方法ですか?より良い方法がありますか?

答えて

1

私には、俳優Aの動作を孤立してテストすることが欲しいと思えます。これを行うためには、あなたが俳優Aは、例えば俳優Bへの参照を取得する方法を制御できるようにする必要があり、あなたが俳優のコンストラクタ内の参照を提供することができます:

import akka.actor.{Actor, ActorRef, Props} 

class A(refToB: ActorRef) extends Actor { ... } 

object A { 
    def props(refToB: ActorRef): Props = Props(new A(refToB)) 
} 

あなたが渡すことができ、代替の方法があります。アクタBのアクタAへの参照は、おそらく最も簡単な選択肢です。上記の例では、アクターのために正しいPropsを作成する方法も提供しています。

これで、アクタBへの参照を制御できるようになりました。テストでアクタ参照をテストプローブと置き換えることができます。

import akka.testkit.TestProbe 

// Initialise a test probe 
val probe = TestProbe() 

// Actor A with reference to actor B replaced with the test probe 
val a = system.actorOf(A.props(probe.ref)) 

// Send a message to actor A 
a ! someMessage 

// Verify that the probe received a correct response from actor A 
p.expectMsgType[MsgToB] 

私が代わりにTestActorRefを使用してのTestKitから俳優・システムを使用して俳優を作成したことに注意してください。つまり、アクターメッセージの処理は同期ではなく非同期になります。個人的には、非同期テストスタイルが、プロダクションシステムでアクターがどのように実行されているかをよりよく表しているため、より適していることがわかりました。 Asynchronous testing is also recommended in the official documentation

+0

私はこれが好きです。私は何かをしなければならなかったので、私は元の実装に行ったが、これは興味深いと思う。目標は、私たちがやっている(模擬された)サービスコールの全チェーンへのウェブリクエストを処理し、データ出力とウェブレスポンスを検証するエントリーアクターからアクターシステム全体をテストすることです。 1つの課題は、アサーションを順序付けする必要がないように非同期動作を取得することでした。これが解決すれば解決します。 – Rig

関連する問題