2013-09-25 12 views
6

Se ho un endpoint che unmarshalls JSON come questo:Come posso simulare una richiesta POST con un corpo json in SprayTest?

(path("signup")& post) { 
    entity(as[Credentials]) { credentials => 
    … 

Come posso provare che con una specifica prova di spruzzo:

"The Authentication service" should { 

"create a new account if none exists" in { 
    Post("/api/authentication/signup", """{"email":"foo", "password":"foo:" }""") ~> authenticationRoute ~> check { 
    handled === true 
    } 
} 
} 

Che ovviamente non funziona per diversi motivi. Quale sarebbe la via corretta?

risposta

11

Il trucco è quello di impostare la corretta Content-Type:

Post("/api/authentication/signup", 
    HttpBody(MediaTypes.`application/json`, 
      """{"email":"foo", "password":"foo" }""") 
) 

Ma diventa ancora più semplice. Se si dispone di una dipendenza spray-JSON, allora tutto quello che dovete fare è di importazione:

import spray.httpx.SprayJsonSupport._ 
import spray.json.DefaultJsonProtocol._ 

la prima importazione contiene (un) marshaller che convertire la stringa in richiesta di JSON e non c'è bisogno di avvolgere in HttpEntity con tipo di supporto esplicito.

la seconda importazione contiene tutti i formati di lettori/scrittori Json per i tipi di base. Ora puoi scrivere solo: Post("/api/authentication/signup", """{"email":"foo", "password":"foo:" }"""). Ma è ancora più bello se hai qualche case case per questo. Per es. è possibile definire un case class Credentials, fornire jsonFormat per questo e usarlo nei test/progetto:

case class Creds(email: String, password: String) 
object Creds extends DefaultJsonProtocol { 
    implicit val credsJson = jsonFormat2(Creds.apply) 
} 

ora in prova:

Post("/api/authentication/signup", Creds("foo", "pass")) 

spruzzo automaticamente Marshall nella richiesta JSON come application/json

+8

credo questo non funziona più con l'ultima versione. Invece, fai questo: '' 'Post ("/api/authentication/signup ", HttpEntity (MediaTypes.application/json'," "" {"email": "foo", "password": "foo"} " ""))) '' ' –

+1

@ GregaKešpret, funziona perfettamente con qualsiasi versione. Attualmente su spray 1.3.1 con akka 2.3.3 – 4lex1v

+1

@AlexIv Dove si trova l'oggetto HttpBody? –