2013-09-25 51 views
6

Nếu tôi có một thiết bị đầu cuối mà unmarshalls json như thế này:Làm cách nào để mô phỏng một yêu cầu POST có thân hình json trong SprayTest?

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

Làm thế nào tôi có thể kiểm tra điều đó với một spec Xịt thử nghiệm:

"The Authentication service" should { 

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

Đó rõ ràng là không làm việc vì nhiều lý do. Điều gì sẽ là cách chính xác?

Trả lời

11

Bí quyết là để thiết lập đúng Content-Type:

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

Nhưng nó được thậm chí đơn giản hơn. Nếu bạn có một sự phụ thuộc phun json, sau đó tất cả các bạn cần làm là nhập khẩu:

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

nhập khẩu đầu tiên chứa (un) marshaller mà sẽ chuyển đổi chuỗi của bạn vào yêu cầu json và bạn không cần phải quấn nó vào HttpEntity với loại phương tiện rõ ràng.

lần nhập thứ hai chứa tất cả định dạng người đọc/nhà văn Json cho các loại cơ bản. Bây giờ bạn có thể viết chỉ: Post("/api/authentication/signup", """{"email":"foo", "password":"foo:" }"""). Nhưng nó thậm chí còn mát hơn nếu bạn có một số trường hợp lớp học cho việc này. Ví dụ: bạn có thể định nghĩa một case class Credentials, cung cấp jsonFormat cho điều này và sử dụng nó trong các bài kiểm tra/dự án:

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

bây giờ trong thử nghiệm:

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

phun tự động marshall nó vào yêu cầu Json như application/json

+8

Tôi tin điều này không còn hoạt động với phiên bản mới nhất. Thay vào đó, hãy làm điều này: '' 'Post ("/api/authentication/signup ", HttpEntity (MediaTypes.'application/json'," "" {"email": "foo", "password": "foo"} " ""))) '' ' –

+1

@ GregaKešpret nó hoàn toàn hoạt động với bất kỳ phiên bản nào. Hiện đang phun 1.3.1 với akka 2.3.3 – 4lex1v

+1

@AlexIv Đối tượng HttpBody nằm ở đâu? –

Các vấn đề liên quan