如何在SprayTest中使用json主体模拟POST请求?

时间:2013-09-25 07:15:47

标签: spray spray-test

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

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

如何使用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
  }
}
}

由于几个原因显然不起作用。什么是正确的方法?

1 个答案:

答案 0 :(得分:12)

诀窍是设置正确的内容类型:

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:" }""")。但如果你有一些案例类,那就更酷了。对于前者您可以定义case class Credentials,为此提供jsonFormat并在测试/项目中使用它:

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

现在正在测试中:

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

自动将其喷射到Json请求中application/json