2016-06-12 15 views
2

レスポンスが俳優の返信に依存するリクエストがあります。私はこの方法でそれをテストしようとしています:Akka-Http:リクエストをテストする方法

val myActor:TestProbe = TestProbe() 

val route = new MyRoute() { 
    override def myServiceActor:ActorRef = { 
     myActor.ref 
    } 
}.route 

"return a query result for GET" in { 
    Get("/foo") ~> route ~> check { 
     myActor.expectMsg(ExecuteFoo()) 
     myActor.reply(FOO) 
     responseEntity shouldEqual toJsonEntity(RequestResult(FOO)) 
    } 
} 

私は正しくexpectMsgが検証されていることを得るが、replyresponseEntityチェックに非同期に関してです。この場合、テストは失敗します。

返信を待つ方法はありますか?

答えて

3

:ここでは一例です。鍵は、要求の実行とそれをチェックすることの組み合わせを(2つの明示的なステップに)check経由で1ステップとして実行することです。最初に実行してから、TestProbeにスタブを付けて最後に確認してください。あなたのサンプルのための更新されたコードは次のようになります。

val result = Get("/foo") ~> route ~> runRoute 
    myActor.expectMsg(ExecuteFoo()) 
    myActor.reply(FOO) 

    check { 
     responseEntity shouldEqual toJsonEntity(RequestResult(FOO)) 
    }(result) 

あなたは、私が最初にすべてのチェックを実行することなく、簡単な実行へのルートをrunRouteを使用していることがわかります。私はこの値をresultに割り当てています。これは、後でチェックするために必要になるからです。その後、TestProbeに対してスタブを安全に行うことができます。この時点で、すでにメッセージが受信されており、どのメッセージがどのメッセージにどのように応答するかを確認するために、呼び出しを待っています。次に、暗黙的に頼るのではなく、明示的な結果(runRouteからのもの)をその呼び出しに渡して、checkと呼ぶことができます。

この方法を使用する場合は、TestProbeを使用して、アクターを呼び出すルートを適切にテストできる必要があります。

+0

ような!ありがとうございました!結果の一種の「歩留まり」が非同期の問題を取り除きます:) – Randomize

0

AutoPilotを使用しています(これは正しいものではないかもしれません)。あなたはTestProbeを使用して正しい軌道に乗っている

val myProbe = TestProbe() 
myProbe.setAutoPilot(new TestActor.AutoPilot { 
    def run(sender: ActorRef, msg: Any) = msg match { 
    case ExecuteFoo(_) => 
     //do something else if needed 
     sender ! FOO 
     TestActor.NoAutoPilot 
    } 
}) 
+0

ありがとうございます。これまではメソッドを受け取ってモックを作成してみましたが、うまくいきました。しかし、それはいくつかのintermittingテストを導入できるかどうかはわかりません。 – Randomize

関連する問題