如果我有一个端点解组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
}
}
}
由于几个原因显然不起作用。什么是正确的方法?
答案 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