2

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

通常,我使用 ScalaTest(FreeSpec 风格)来设置端点调用,然后对响应运行几个单独的测试。对于 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- 出于某种原因,像status和之类的值responseAs仅在该块内的顶层可用。我可以通过将我感兴趣的值保存到顶级局部变量来避免错误,但是如果响应解析失败,这很尴尬并且能够使测试框架崩溃。

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

4

1 回答 1

1

你可以这样分组你的测试

"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
   }
}
于 2018-06-01T15:32:34.503 回答