2016-12-12 2 views
2

Ich versuche, einen Test für ein Gesuchnicht impliziten Wert für Beweise Parameter des Typs finden konnte^

hier ist mein Code zu schreiben:

val request = CreateLinkRequest(token = Some(validToken),billing_ref_id = Some("123"), store_id = Some("123"), agent_id = Some("123")) 

val endPoint = Uri(this.serverRootUrl + "path").toString 
val post = Post(endPoint, request) 
val pipeline = jsonAsStringPipeline(post) 
val responseContents = Await.ready(pipeline, atMost = callMaxWaitDuration) 

Aber diese nicht Kompilierung, halte ich dies immer Fehler:

Error:(156, 20) could not find implicit value for evidence parameter of type spray.httpx.marshalling.Marshaller[CreateLinkSpec.this.CreateLinkRequest] 
    val post = Post(endPoint, request) 
      ^
Error:(156, 20) not enough arguments for method apply: (implicit evidence$1: 

spray.httpx.marshalling.Marshaller[CreateLinkSpec.this.CreateLinkRequest])spray.http.HttpRequest in class RequestBuilder. 
Unspecified value parameter evidence$1. 
    val post = Post(endPoint, request) 
       ^

Was bedeutet das?

Wie kann ich es beheben?

EDIT: dies ist die json im Körper:

{ token:"123", billing_ref_id:"123", store_id:"123", agent_id:"123"} 

und das ist das Objekt für sie im Code:

private final case class CreateLinkRequest(
    token: Option[String] = Some(validToken), 
    billing_ref_id: Option[String] = Some(Random.alphanumeric.take(10).mkString), 
    agent_id: Option[String] = Some(Random.alphanumeric.take(3).mkString), 
    store_id: Option[String] = Some(Random.alphanumeric.take(3).mkString) 
    ) 
+4

Mögliches Duplikat von [konnte keinen impliziten Wert für den Parameter marshaller finden: spray.httpx.marshalling.ToResponseMarshaller] (http://stackoverflow.com/questions/20408734/could-not-find-implicit-value-for-pa- rameter -marshaller-spray-httpx-marshalling) – engineerC

+0

leider löst das nicht mein Problem –

+0

Wie sieht Ihre POST-Route aus? Benötigt es JSON im Körper? –

Antwort

3

Sie versuchen Post Methode aufzurufen, die implicit Marshaller nimmt als Parameter. Beachten Sie, dass implizite Parameter müssen nicht so lange zur Verfügung gestellt werden, wie der Compiler eine im Rahmen (überprüfen Sie dies für weitere Informationen über implicits: Where does Scala look for implicits?) finden

aber Ihr Code hat keine implizite Marshaller so definiert Der Compiler weiß nicht, wie Sie Ihre case class in die HttpEntity konvertieren können.

In Ihrem Fall möchten Sie es in die HttpEntity mit Content-Type: application/json umgewandelt werden. Dazu müssen Sie nur definieren: implicit val CreateLinkRequestMarshaller: Marshaller[CreateLinkRequest]. Dies sagt scala, wie Sie Ihre case class in die HttpEntity konvertieren.

Sie möchten auch, dass es an den Kontext als JSON übergeben wird, also werden wir unser JsonProtocol definieren, d. H. MyJsonProtocol.

package test 

import spray.http.HttpEntity 
import spray.http._ 
import spray.json._ 
import spray.httpx.marshalling.{Marshaller, MarshallingContext} 
import test.TestMarshaller.CreateLinkRequest 


object MyJsonProtocol extends DefaultJsonProtocol { 
    implicit def createLinkRequestFormat: JsonFormat[CreateLinkRequest] = jsonFormat4(CreateLinkRequest) 
} 

object TestMarshaller extends App { 
    import MyJsonProtocol._ 

    case class CreateLinkRequest(token: Option[String], billing_ref_id: Option[String], store_id: Option[String], agent_id: Option[String]) 

    implicit val CreateLinkRequestMarshaller: Marshaller[CreateLinkRequest] = new Marshaller[CreateLinkRequest] { 
    override def apply(value: CreateLinkRequest, ctx: MarshallingContext): Unit = { 
     val entity = HttpEntity(MediaTypes.`application/json`, value.toJson.compactPrint) 
     ctx.marshalTo(entity) 
    } 
    } 

    // Here goes your test 
} 

Beachten Sie, dass Sie diese implicits woanders, z. a package und dann importieren Sie es nur in der Testklasse. Das wäre besser, weil Sie den Marshaller sicher wiederverwenden wollen.

Verwandte Themen