如何从akka.http.scaladsl.server.Directive测试自定义指令/提取值?

时间:2017-10-26 11:38:08

标签: scala akka-http

我有一个自定义指令,其函数如下所示,返回Directive1[ValidatedParameters],其中ValidatedParameters只是一个简单的案例类:

class MyCustomDirective {
    def validateParameters(...): Directive1[ValidatedParameters] = {
        ...
        provide(ValidatedParameters(...))
    }
}

我在我的路线中这样使用它:

myCustomDirective.validateParameters(top, skip, modifiedDate) {
    (validatedParameters: ValidatedParameters) => {

但是,我有一个单元测试,我基本上想调用上面的函数并验证ValidatedParameters是我期望的:

val actualResult: Directive1[ValidatedParameters] = new MyCustomDirective().validateParameters(...)

所以actualResultDirective1[ValidatedParameters],有没有办法可以通过单元测试访问此指令中的ValidatedParameters案例类?

2 个答案:

答案 0 :(得分:0)

这是为here所述的自定义指令编写测试用例的解决方案:

REQUEST ~> ROUTE ~> check {
  ASSERTIONS
}

对于获取pageper_page查询参数的自定义指令:

case class Paginate(page: Option[String], perPage: Option[String])

trait PaginationDirective extends ParameterDirectives with RespondWithDirectives {

  def withPagination: Directive1[Paginate] = {
    parameters(
      (
        "page".as[String].?,
        "per_page".as[String].?
      )
    ).tmap { case (pageOpt, perPageOpt) => Paginate(pageOpt, perPageOpt) }
 }
}

上述自定义指令的测试用例:

import akka.http.scaladsl.server.Directives.complete
import akka.http.scaladsl.testkit.ScalatestRouteTest
import org.scalatest.{Matchers, WordSpec}

class PaginationDirectiveTest extends WordSpec with Matchers with PaginationDirective with ScalatestRouteTest {

  "paginate directive" should {
    "return page and per page parameters" in {
      Get("/?page=1&per_page=25") ~> withPagination(i => complete(i.toString)) ~> check {
        responseAs[String] shouldEqual "[Paginate(Some(1), Some(25))]"
      }
    }
  }
} 

答案 1 :(得分:-1)

我最终得到了以下内容:

import akka.http.scaladsl.server.Directives.complete
import akka.http.scaladsl.testkit.ScalatestRouteTest
import de.heikoseeberger.akkahttpcirce.ErrorAccumulatingCirceSupport._
import org.scalamock.scalatest.MockFactory
import org.scalatest.{BeforeAndAfter, Matchers}

class MyTest extends ScalatestRouteTest {

...

"validate(top=None, skip=None, modifiedDate=None)" should "pass validation" in {
    myCustomDirective.validate(top, skip, modifiedDate) {
      (validatedParameters: ValidatedParameters) => {
        validatedParameters shouldEqual expectedResult
        complete("") // Needed to pass compilation
      }
    }
  }
}