いくつかの Scalatra ルートのテストを書いています。私は Scala 2.10.2、Scalatra 2.2.1、および Scalatest 1.9.2 を使用しています。私はこれら3つすべてを使用することにかなり慣れていません。また、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")
入力ミスがないことを確認するためにルートをテストしましたが、このルートも問題なく動作します。私が知る限り、2 つのルートの唯一の違いは、プロファイル ルートには 2 つのパス パラメーターがあり、ボディ パラメーターに異なるデータ型を使用することです (成功したテストは ScalatraRecord を使用し、失敗したテストは Contact を使用し、Contact は継承します)。 ScalatraRecord から); アカウント ルートに偽のパス パラメータを追加してみました。また、ボディ パラメータのタイプをプロファイルのパラメータと一致するように変更しようとしましたが、同じエラーが発生しました。
あるルートがテストに合格するのに、他のルートでは「実装されていません」というエラーが表示される理由がわかりません。どうすればこれを修正できるかについて、誰かアイデアはありますか?