【问题标题】:How to test a controller method that uses a custom parser in play 2.5?如何在 play 2.5 中测试使用自定义解析器的控制器方法?
【发布时间】:2016-02-28 16:24:58
【问题描述】:

我的控制器方法:

def postCategory = Action(parse.tolerantText) { request =>
    Ok("")
  }

这是我的测试:

val result = categoryController.postCategory.apply(FakeRequest())
      status(result) mustEqual OK //error this line

我有这个错误:

错误:(63, 14) 类型不匹配;成立 : play.api.libs.streams.Accumulator[akka.util.ByteString,play.api.mvc.Result] 必需:scala.concurrent.Future[play.api.mvc.Result] status(result) mustEqual OK ^

似乎使用自定义解析器 parse.* 使其返回 Accumulator 而不是 Future[Result]

我正在使用 play 2.5-RC2

【问题讨论】:

标签: scala unit-testing playframework


【解决方案1】:

你应该使用 result.run 来获取带有 Guice 的 Materializer 实例

看起来像:

import akka.stream.Materializer
//...

def mockApp = new GuiceApplicationBuilder().build()
val mtrlzr = mockApp.injector.instanceOf[Materializer]

val result: Accumulator[ByteString, Result] = controller.accessToken()(FakeRequest())
val runResult: Future[Result] = result.run()(mtrlzr)    

【讨论】:

    【解决方案2】:

    你可以试试这样的:

      val result = categoryController.postCategory.apply(FakeRequest())
      status(result.run) must equalTo(OK)
    

    看起来 Accumulator 有一个很好的 run() 方法,它返回一个 Future

    【讨论】:

    • run() 方法需要 implicit materializer: Materializer 输入。这对我来说很奇怪,因为在 play 2.3 中不必这样做。你有什么想法吗?
    • 我的猜测是 Play 2.5 向 Akka Streams 迈出了一大步,因为它可以处理任何必须异步完成的事情。 Akka Streams 在这里说 [doc.akka.io/docs/akka/2.4.2/scala/stream/…“Materializer 是流执行引擎的工厂......”
    • 我在这里遇到了同样的问题:stackoverflow.com/questions/48036803/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 2017-01-02
    • 1970-01-01
    • 2012-04-20
    • 2019-07-08
    相关资源
    最近更新 更多