2013-09-25 11 views
6

Jeśli mam końcowy że unmarshalls json tak:Jak mogę zasymulować żądanie POST z ciałem JSON w SprayTest?

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

Jak mogę sprawdzić, które ze specyfikacji testowej Spray:

"The Authentication service" should { 

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

To oczywiście nie działa z kilku powodów. Jaki byłby właściwy sposób?

Odpowiedz

11

Sztuką jest, aby ustawić właściwą Content-Type:

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

Ale to staje się jeszcze prostsze. Jeśli masz zależność sprayu-json, wtedy wszystko, co trzeba zrobić, to import:

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

pierwszy import zawiera (ONZ) naziemnego które mogłyby przekształcić swój ciąg na żądanie json i nie trzeba zawinąć go w HttpEntity z jawnym typem mediów.

Drugi import zawiera wszystkie formaty czytelników/zapisów Json dla typów podstawowych. Teraz możesz napisać tylko: Post("/api/authentication/signup", """{"email":"foo", "password":"foo:" }"""). Ale jest jeszcze fajniej, jeśli masz do tego klasę przypadków. Na przykład Można zdefiniować case class Credentials zapewniają jsonFormat za to i używać go w testach/projekt:

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

teraz w teście:

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

sprayu automatycznie Marshall to do wniosku Json jak application/json

+8

wierzę to nie działa już z najnowszą wersją. Zamiast tego wykonaj: '' Post ("/ api/authentication/signup", HttpEntity (MediaTypes'application/json', "" "{" email ":" foo "," password ":" foo "}" ""))) '' ' –

+1

@ GregaKešpret doskonale współpracuje z każdą wersją. Obecnie na sprayu 1.3.1 z akka 2.3.3 – 4lex1v

+1

@AlexIv Gdzie znajduje się obiekt HttpBody? –