我第一次使用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
块内的嵌套测试 - 出于某种原因,像status
和responseAs
这样的值只能在该块中位于顶层。我可以通过将我感兴趣的值保存到顶级局部变量来避免错误,但是这样做很麻烦且能够使测试框架崩溃,例如:响应解析失败。
有没有办法解决这个问题,而不是将所有断言都放在一个测试中或为每个测试执行新的请求?
答案 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
}
}