2

我正在为几条 Scalatra 路线编写测试。我正在使用 Scala 2.10.2、Scalatra 2.2.1 和 Scalatest 1.9.2;我在使用这三个方面还很陌生。我还在使用带有 ScalaTest 插件的 Eclipse Scala IDE 3.0.1。

对于我的 ScalatraBootstrap 我有

context.mount(new AccountsController, "/accounts")
context.mount(new ProfilesController, "/profiles")

在 ProfilesController 我有以下路线

val addImage =
  (apiOperation[Int]("addImage")
    parameters (pathParam[String]("context").description("Profile context"),
    pathParam[Int]("id").description("Profile Id"),
    Parameter("body", "body data",
      DataType[ScalatraRecord],
      paramType = ParamType.Body)))
post("/:context/:id/images", operation(addImage)) { ... }

这是经过测试的

test("add a profile image") {
  val json = JObject("name" -> JString("asdf")) merge JObject("image_file_url" -> JString("test.png"))
  val bytes = compact(render(json)).getBytes("utf-8")
  post("/profiles/users/1/images", bytes, Map("Content-Type" -> "application/json")) {
    status should be(200)
  }
}

这通过了测试。

在 AccountsController 我有以下路线

val addContact =
  (apiOperation[Int]("addContact")
  parameters (
    Parameter("contact", "new contact data",
      DataType[Contact],
      paramType = ParamType.Body)))
post("/contacts", operation(addContact)) { ... }

经测试

test("add contact") {
  val json = JObject("name" -> JString(rand.nextString(10))) merge JObject("email" -> JString(rand.nextString(10)))
  val bytes = compact(render(json)).getBytes("utf-8")
  post("/accounts/contacts", bytes, Map("Content-Type" -> "application/json")) {
    status should be(200)
  }
}

这失败了;状态为 500,正文为“未实施”。该路线在生产中运行良好。我测试了get("/accounts/contacts")一条路线以确保我没有任何拼写错误,并且这条路线也可以正常工作。据我所知,这两个路由之间的唯一区别是配置文件路由有两个路径参数并为其主体参数使用不同的数据类型(成功的测试使用ScalatraRecord,失败的测试使用Contact;Contact继承来自 ScalatraRecord); 我尝试将虚假路径参数添加到帐户路由,并且还尝试更改其主体参数的类型以匹配配置文件的参数,但我遇到了同样的错误。

我不明白为什么一条路线会通过测试,而另一条路线会给我一个“未实施”错误。有人对我如何解决这个问题有任何想法吗?

4

0 回答 0