在akka-http路由检查中嵌入多个测试

时间:2018-03-07 11:59:43

标签: scala scalatest akka-http akka-testkit

我第一次使用akka-http - 我选择的常用网络框架是http4s - 而且我很难找到通常编写端点单元测试的方式来处理由akka-http-testkit提供的路由测试。

通常,我使用ScalaTest(FreeSpec flavor)来设置端点调用,然后对响应运行几个单独的测试。对于akka-http-testkit,这看起来像:

import akka.http.scaladsl.model.StatusCodes
import akka.http.scaladsl.server.Directives._
import akka.http.scaladsl.server.Route
import akka.http.scaladsl.testkit.ScalatestRouteTest
import org.scalatest.{FreeSpec, Matchers}

final class Test extends FreeSpec with ScalatestRouteTest with Matchers {

  val route: Route = path("hello") {
    get {
      complete("world")
    }
  }

  "A GET request to the hello endpoint" - {
    Get("/hello") ~> route ~> check {
      "should return status 200" in {
        status should be(StatusCodes.OK)
      }

      "should return a response body of 'world'" in {
        responseAs[String] should be("world")
      }

      //more tests go here
    }
  }
}

此错误

java.lang.RuntimeException: This value is only available inside of a `check` construct!

问题是check块内的嵌套测试 - 出于某种原因,像statusresponseAs这样的值只能在该块中位于顶层。我可以通过将我感兴趣的值保存到顶级局部变量来避免错误,但是这样做很麻烦且能够使测试框架崩溃,例如:响应解析失败。

有没有办法解决这个问题,而不是将所有断言都放在一个测试中或为每个测试执行新的请求?

1 个答案:

答案 0 :(得分:0)

您可以将测试分组

"A GET request to the hello endpoint should" in {
   Get("/hello") ~> route ~> check {
       status should be(StatusCodes.OK)
       responseAs[String] should be("world")
       //more tests go here
   }
}