我有一个自定义指令,其函数如下所示,返回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(...)
所以actualResult
是Directive1[ValidatedParameters]
,有没有办法可以通过单元测试访问此指令中的ValidatedParameters案例类?
答案 0 :(得分:0)
这是为here所述的自定义指令编写测试用例的解决方案:
REQUEST ~> ROUTE ~> check {
ASSERTIONS
}
对于获取page
和per_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
}
}
}
}