1

同僚が Spray.io で作成した API のテストをセットアップしようとしていますが、奇妙な動作に遭遇しています。何らかの理由でリクエストがエラーになった場合、次の行に沿って JSON 値を返したいと考えています。

{"status":false,"message":"useful message here"}

これは、実際のブラウザでは問題なく発生します。Web ブラウザーで未処理のルートに移動し、目的の JSON 値を取得しました。だから、私はこれをテストしたい。さて、spray.io は初めてなので、非常に簡単なテストから始めました。

"leave GET requests to root path unhandled" in {
  Get() ~> myRoute ~> check {
    handled must beFalse
  }
}

これはうまくいきました。問題はありません。Spray.io で遊ぶのは初めてなので、偽のルートをテストするためのサンプル テストをいくつか見て、テストに失敗することなく応答を確認できるようにラップmyRouteしました。sealRoute()

"leave GET requests to root path unhandled" in {
  Get() ~> sealRoute(myRoute) ~> check {
    handled must beTrue
  }
}

これもうまくいきます。そのため、JSON を解析して個々の値を検証する手間をかける前に、応答のテキストがこれで使用できることを確認することにしました。

"leave GET requests to root path unhandled" in {
  Get() ~> sealRoute(myRoute) ~> check {
    responseAs[String] contains "false"
  }
}

これは失敗しています。調査するために、単純なコード行を挿入して の実際の値をresponseAs[String]ファイルに記録すると、次のようになりました。

The requested resource could not be found.

誰が私が間違っているのか教えてもらえますか? 次のいずれかが発生していると考えています。

  • responseAs[String]正確な応答を取得してそれを返すだけではなく、途中で何らかのフィルターを適用します
  • フレームワーク自体はクエリを完全には評価していませんが、テストフレームワークが評価するモックアップオブジェクトを作成しているため、同僚が実装した目的の「エラーをjsonに変換」メソッドを実行していません

特に同様の問題についてGoogleとスタックオーバーフローを検索してみましたが、適切なクエリを入力していないか、他のほとんどの人がデフォルトのエラーメッセージに満足していて、チェックを超えてテストしようとしていませんhandled must beFalse.

編集 - これは RejectionHandler の関連部分です。

case MissingQueryParamRejection(paramName) :: _=>
  respondWithMediaType(`application/json`) {
    complete(BadRequest, toJson(Map("status" -> false, "message" -> s"Missing parameter $paramName, request denied")))
  }
4

1 に答える 1