我如何找出从中选择隐式值的地方

时间:2019-08-20 15:58:16

标签: scala playframework-2.6

我观察到一个奇怪的行为。在我的一个测试用例中,我正在使用contentAsJson。在该测试用例中,编译器没有抱怨我必须为implicitTimeout

提供一个Materializer值。
class UserControllerUnitSpec extends PlaySpec with BeforeAndAfterAll with BeforeAndAfterEach with OneAppPerSuiteWithComponents{
..
  "User signup request with body but with incorrect profile data " should {
    "return error message " in {

...val resultFuture: Future[Result] = testEnv.controller.signupUser(request)
    val responseBodyAsJsValue: JsValue = contentAsJson(resultFuture)//works
...
}
}

但是在另一个测试案例中,编译器给出了我需要提供值的错误

class QuestionsControllerUnitSpec extends PlaySpec with BeforeAndAfterAll with BeforeAndAfterEach with OneAppPerSuiteWithComponents{
...
"newQuestion" should {
    "should return error if the size of the body in the request is more than the maximum allowed size" in {
...
val response:Accumulator[ByteString,Result] = questionController.newQuestion(request)
val responseBody = contentAsJson(response)//(Timeout(Duration(5000,"millis")),testEnv.testEnv.mat). 
...
}

我收到错误

Error:(1485, 39) could not find implicit value for parameter mat: akka.stream.Materializer
      val responseBody = contentAsJson(response)//(Timeout(Duration(5000,"millis")),testEnv.testEnv.mat)

我该如何调试为什么一个有效而另一个无效?

更新-在马里奥的答案之后添加了返回类型。

1 个答案:

答案 0 :(得分:0)

尝试像这样提供隐式Materializer

import play.api.test.Helpers._
implicit val actorSystem = ActorSystem("test")
implicit val materializer = ActorMaterializer()
val responseBody = contentAsJson(response)

代替显式testEnv.testEnv.mat

contentAsJson(response)(Timeout(Duration(5000,"millis")),testEnv.testEnv.mat)

关于两个测试之间的区别,请注意contentAsJson的两个重载版本

def contentAsJson(of: Future[Result])(implicit timeout: Timeout, mat: Materializer = NoMaterializer): JsValue

def contentAsJson(of: Accumulator[ByteString, Result])(implicit timeout: Timeout, mat: Materializer): JsValue

在第一种情况下,我们看到提供了默认的Materializer参数

mat: Materializer = NoMaterializer

而在第二种情况下,我们必须提供我们自己的。因此,在第一个测试中,resultFuture的类型可能是Future[Result],而在第二个测试中,response的返回类型是Accumulator

关于找出隐式内容的来源,我个人使用IntelliJ的View | Show Implicit Hints功能。