2013-09-25 12 views
6

böyle json unmarshalls bir bitiş noktası varsa:SprayTest'te bir POST istemiyle bir POST isteğini nasıl taklit edebilirim?

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

nasıl test edebileceği bir Sprey testi spec ile:

"The Authentication service" should { 

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

besbelli çeşitli nedenlerle çalışmıyor. Doğru yol ne olurdu?

cevap

11

hile doğru Content-Type ayarlamaktır:

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

Ama daha basit olur. Eğer bir sprey json bağımlılığı varsa, o zaman yapmanız gereken ithalat ise:

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

ilk ithalat json istek halinde dize dönüştürmek istiyorum (me) Marshaller içeriyorsa ve içine kaydırmak gerekmez Açık ortam türü ile HttpEntity.

ikinci içe aktarma, temel türler için tüm Json okuyucuları/yazıcı biçimlerini içerir. Şimdi sadece yazabilirsiniz: Post("/api/authentication/signup", """{"email":"foo", "password":"foo:" }"""). Ancak bunun için bazı vaka sınıfınız varsa daha da havalı. Örn. Eğer bir case class Credentials tanımlamak bunun için jsonFormat sağlamak ve testlerde kullanabilirsiniz/proje: testinde şimdi

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

: application/json

+8

inanıyorum olarak Json istek içine

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

sprey otomatik Marshall onu Bu artık en son sürümle çalışmıyor. Bunun yerine, şunu yapın: '' Post ("/ api/kimlik doğrulama/kayıt", HttpEntity (MediaTypes.'application/json', "" "{" email ":" foo "," password ":" foo "}" ""))) '' –

+1

@ GregaBasım herhangi bir sürümle mükemmel çalışır. Halihazırda sprey 1.3.1 ile akka 2.3.3 – 4lex1v

+1

@AlexIv HttpBody nesnesi nerededir? –