2016-04-29 13 views
8

Ich versuche, den Fehler (s), den ich unten sehe, zu verstehen und zu lernen, wie ich es beheben kann.Wie gebe ich einen impliziten Wert für einen akka.stream.Materializer beim Senden eines FakeRequest ein?

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 
           ^

Hier ist der Testcode, der den Fehler verursacht (e):

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

Versuchen Sie dieses: 'implizite val Materialisierer = ActorMaterializer()' –

+0

Dank @Mario. Ich bin mir nicht sicher, wo ich diese Zeile hinstellen soll. – gknauth

Antwort

12

Sie können eine implizite ActorMaterializer innerhalb Ihrer Testklasse erstellen, die Testkit der ActorSystem verwenden:

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

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

    implicit val materializer = ActorMaterializer() 

    val bbox = ... 
+0

Danke, ich werde es versuchen. – gknauth

0

Sie brauchen Materializer nicht.

Ich glaube, Sie nicht die richtige Methode action.apply anrufen.
Sie wollen def apply(request: Request[A]): Future[Result]
das Recht anzurufen, Sie FakeRequest[AnyContent], gleiche parametrisierte Typ wie action:Action[AnyContent] .Diese Art müssen von PlayBodyParser gezwungen ist, ich glaube, Sie für Ihre Aktion gesetzt.

Danach brauchen Sie nicht .run Anruf

+0

Ich schaue mal und probiere deinen Vorschlag, danke. – gknauth