6

如果我有一个像这样解组 json 的端点:

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

如何使用喷雾测试规范进行测试:

"The Authentication service" should {

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

这显然是行不通的,原因有几个。正确的方法是什么?

4

1 回答 1

12

诀窍是设置正确的 Content-Type:

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

但它变得更加简单。如果你有一个 spray-json 依赖项,那么你需要做的就是导入:

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

第一个导入包含(un)marshaller,它将您的字符串转换为 json 请求,您不需要HttpEntity使用显式媒体类型将其包装。

第二个导入包含基本类型的所有 Json 读取器/写入器格式。现在你可以只写:Post("/api/authentication/signup", """{"email":"foo", "password":"foo:" }"""). 但是,如果您为此提供了一些案例课程,那就更酷了。例如。您可以定义 a case class CredentialsjsonFormat为此提供并在测试/项目中使用它:

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

现在在测试中:

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

Spray 自动将其编组为 Json 请求application/json

于 2013-09-25T13:09:08.493 回答