我怎样才能知道从哪里选择隐式值
how can i found out from where an implicit value is being picked
我观察到一个奇怪的行为。在我的一个测试用例中,我使用 contentAsJson
。在那个测试用例中,编译器没有抱怨我必须为 Timeout
和 Materializer
提供 implicit
值
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)
我如何调试为什么一个工作正常而另一个不工作?
更新 - 在马里奥的回答后添加了 return 类型。
尝试像这样提供隐式 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
的 return 类型可能是 Accumulator
。
关于查找提供隐式的位置,我个人使用 IntelliJ 的 View | Show Implicit Hints
功能。
我观察到一个奇怪的行为。在我的一个测试用例中,我使用 contentAsJson
。在那个测试用例中,编译器没有抱怨我必须为 Timeout
和 Materializer
implicit
值
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)
我如何调试为什么一个工作正常而另一个不工作?
更新 - 在马里奥的回答后添加了 return 类型。
尝试像这样提供隐式 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
的 return 类型可能是 Accumulator
。
关于查找提供隐式的位置,我个人使用 IntelliJ 的 View | Show Implicit Hints
功能。