2

いくつかの 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 から); アカウント ルートに偽のパス パラメータを追加してみました。また、ボディ パラメータのタイプをプロファイルのパラメータと一致するように変更しようとしましたが、同じエラーが発生しました。

あるルートがテストに合格するのに、他のルートでは「実装されていません」というエラーが表示される理由がわかりません。どうすればこれを修正できるかについて、誰かアイデアはありますか?

4

0 に答える 0