9

を使用して、アプリケーションのテスト ケースを作成しようとしていますakka-http。テストケースの 1 つを以下に示します。

import akka.http.scaladsl.model.headers.RawHeader
import akka.http.scaladsl.testkit.{ ScalatestRouteTest}
import com.reactore.common.core.{CommonCoreSystem, CommonActors, BootedCommonCoreSystem}
import scala.concurrent.duration._
import com.reactore.common.feature.referencedata.{DepartmentRepository, DepartmentService, DepartmentController, DepartmentRest}
import org.scalatest.concurrent.AsyncAssertions
import org.scalatest.time.Span
import org.scalatest.{WordSpec, Matchers}
import akka.http.scaladsl.model.StatusCodes._
/**
 * Created by krishna on 18/6/15.
 */


class DepartmentITTest extends WordSpec with Matchers with ScalatestRouteTest with CommonCoreSystem with CommonActors {
//  override val departmentRouter = system.actorOf(Props(classOf[DepartmentService], DepartmentRepository), Constants.DEPARTMENT_ROUTER_NAME)
  val deptRoute = (new DepartmentRest(departmentRouter)(DepartmentController).deptRoutes)
  implicit val timeout = AsyncAssertions.timeout(Span.convertDurationToSpan(5.second))
  val departmentJson = """{"id":13,"name":"ENGP22","shortCode":"ENGP2","parentDepartmentId":null,"mineId":null,"photoName":null,"isRemoved":false,"isPendingForApproval":false,"createdBy":0,"createDate":"2015-03-09 00:00:00","modifiedBy":0,"modifiedDate":"2015-03-09 00:00:00"}"""
  val header = RawHeader("apiKey", "xxxxx")
  "Service" should  {
    "return department by id" in {
      Get("/departments/13").withHeaders(header) ~> deptRoute ~> check {
//        Thread.sleep(500)
        status shouldBe OK
        responseAs[String] shouldBe departmentJson
      }
    }
  }
}

これを実行すると、正しく動作することもあれば、エラーが発生することもありますRequest was neither completed nor rejected within 1 second。今すぐ機能させるために Thread.sleep を追加しました。私はそれが正しい解決策ではないことを知っています。テストを 1 秒以上待機させる方法を誰か教えてもらえますか?

4

3 に答える 3

12

以下は私のために働いています:

import akka.actor.ActorSystem
import scala.concurrent.duration._
import spray.testkit.ScalatestRouteTest

class RouteSpec extends ScalatestRouteTest {
  implicit def default(implicit system: ActorSystem) = RouteTestTimeout(2.second)
...
于 2016-09-23T21:36:06.270 に答える
6

ScalaTest で「最終的に」マッチャーを使用して、条件が真になるのを待つことができます。

eventually { status shouldBe OK }

http://www.artima.com/docs-scalatest-2.0.M5/org/scalatest/concurrent/Eventually.html

上でコメントアウトした Thread.sleep で問題が解決する場合は、これで十分です。

ただし、実際のエラーは、RouteTest トレイトが使用しているタイムアウトが短すぎることです。エラー メッセージ「リクエストは 1 秒以内に完了も拒否もされませんでした。」akka.http.scaladsl.testkit.RouteTest 経由で RouteTestResultComponent から取得されます。

Thread.sleep は気を散らすものだと思います。ルーティング テストのデフォルトのタイムアウトは 1 秒です。を参照してくださいakka.http.scaladsl.testkit.RouteTestTimeout.default。コードで 5 秒の暗黙的なタイムアウトを提供していますが、それは別のタイプだと思います。より長いタイムアウトで RouteTestTimeout を暗黙的に利用可能にしてみてください。

于 2015-08-17T14:07:12.753 に答える