2016-04-29 41 views
8

Próbuję zrozumieć błędy, które widzę poniżej, i dowiedzieć się, jak to naprawić.Jak dostarczyć domyślną wartość dla akka.stream.Materializer podczas wysyłania FakeRequest?

could not find implicit value for parameter materializer: akka.Stream.Materializer 
    val fut: Future[Result] = action.apply(fakeRequest).run 
           ^
not enough arguments for method run (implicit materializer: akka.stream.Materializer)scala.concurrent.Future[play.api.mvc.Result]. 
Unspecified value parameter materializer. 
    val fut: Future[Result] = action.apply(fakeRequest).run 
           ^

Oto kod testu, który spowodował błąd (s):

package com.foo.test 

import com.foo.{Api, BoundingBox} 
import org.scalatest.{FlatSpec, Matchers} 
import play.api.libs.json._ 
import play.api.mvc._ 
import play.api.test.{FakeHeaders, FakeRequest} 

import scala.concurrent.duration._ 
import scala.concurrent.{Await, Future} 

class TestJmlPlay extends FlatSpec with Matchers { 

    val bbox = new BoundingBox(-76.778154438007732F, 39.239828198015971F, -76.501003519894326F, 39.354663763993926F) 

    "latitudes" should "be between swLat and neLat" in { 
    val action: Action[AnyContent] = (new Api).getForPlay(bbox) 
    val jsonStr = getStringFromAction(action) 
    areLatitudesOk(jsonStr, bbox) shouldBe true 
    } 

    private def getStringFromAction(action:Action[AnyContent]):String = { 
    val fakeRequest: Request[String] = new FakeRequest("fakeMethod", "fakeUrl", new FakeHeaders, "fakeBody") 
    val fut: Future[Result] = action.apply(fakeRequest).run // <== ERROR! 
    val result = Await.result(fut, 5000 milliseconds) 
    result.body.toString 
    } 

    private def areLatitudesOk(jsonStr: String, bbox: BoundingBox): Boolean = ... 

} 
+0

Spróbuj tego: 'niejawna val materializatora = ActorMaterializer()' –

+0

Thanks @Mario. Nie jestem jednak pewien, gdzie umieścić tę linię. – gknauth

Odpowiedz

12

można utworzyć niejawny ActorMaterializer w swojej klasie testowej, która będzie używać testkit na ActorSystem:

import akka.testkit.TestKit 
import akka.actor.ActorSystem 

class TestJmlPlay(_system : ActorSystem) extends TestKit(_system) ... { 

    implicit val materializer = ActorMaterializer() 

    val bbox = ... 
+0

Dzięki, spróbuję tego. – gknauth

0

Nie potrzebujesz Materializera.

Uważam, że nie nazywa się właściwą metodą action.apply.
Chcesz def apply(request: Request[A]): Future[Result]
Aby połączyć prawo, trzeba FakeRequest[AnyContent], typ samego typu sparametryzowanego jak action:Action[AnyContent] .To jest zmuszony przez PlayBodyParser wierzę ustawić do działania.

Po tym nie trzeba .run połączenia

+0

Przyglądam się i próbuję Twojej sugestii, dzięki. – gknauth