我观察到一个奇怪的行为。在我的一个测试用例中,我正在使用contentAsJson
。在该测试用例中,编译器没有抱怨我必须为implicit
和Timeout
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)
我该如何调试为什么一个有效而另一个无效?
更新-在马里奥的答案之后添加了返回类型。
答案 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
功能。