2

Web サービスをスタブ化するために、Spray と WireMock を備えた Akka アクター システムを使用しています。また、外部の http 要求が既に行われたことも確認したいと思います。

次の使用例では、Spray サーバーに対して POST 要求が行われ、外部サービスに要求を送信する必要があります。

stubFor(get(urlEqualTo("/external-service"))
    .willReturn(aResponse()
      .withStatus(200)
      .withBodyFile("response-body.json")));

myService ! Post("/my-service", FormData(Seq("id" -> "1")))

Thread.sleep(1000)

verify(postRequestedFor(urlEqualTo("/services/harvesterService")))

さまざまな例で、Thread.sleep 手法を見てきました。そうしないと、ActorSystem がシャットダウンされ、サービスが外部サービスに対して http 要求を行うことがないためです。

これを回避することは可能ですか?WireMock は外部サービスへのリクエストを待つことができますか? おそらくいくつかのタイムアウトがあります...

4

1 に答える 1

1

注: これは、アクターがメッセージを受信したときに実際に HTTP 呼び出しを送信することを前提としています。スプレー ルートを直接テストする場合は、スプレー ルートをテストする標準的な方法であるhttp://spray.io/documentation/1.2.3/spray-testkit/を参照することをお勧めします。

通常、私は ScalaTest を Akka/Spray TestKit と一緒に使用し、eventually関数を使用します。eventually最終的に発生する条件を繰り返し確認できます。メソッドによってスローされた例外をキャッチverifyすると、投稿が実際に送信されたかどうかをアサートできます。次のようなものを使用できます

def postHasBeenSent(url: String): Boolean = 
  try {
    verify(postRequestedFor(urlEqualTo(url)))
    true
  } catch {
    case e: VerificationException => false
  }

(必要Tryに応じてモナドを使用することもできますが、それはここでは重要ではありません!)

そして、テストで(マッチャーを使用していると仮定して):

myService ! Post("/my-service", FormData(Seq("id" -> "1")))

eventually {
  postHasBeenSent("/my-service") shouldBe true
}

http://doc.scalatest.org/2.2.6/index.html#org.scalatest.concurrent.Eventuallyeventuallyで、詳細とそれに付随するすべての利点 (ポーリング間隔など) を見つけることができます。

于 2016-03-02T10:32:29.543 に答える