Finchはエンドポイントを作るときに戻り値を型で縛れるので、正常系のレスポンスに関してはコンパイラを信用して大丈夫だろう。ただし、ステータスコードまでは検証出来ないので、リクエストパラメータによってステータスコードが変わる場合などはしっかりとテストを書いておきたい。

FinchのEndpoint型はtoService関数でcom.twitter.finagle.Service型に変わり、これにRequestを渡せばResponse型が返ってくるらしい。REPLで確認してみた。

scala> import io.finch._
import io.finch._

scala> import com.twitter.finagle.http._
import com.twitter.finagle.http._

scala> import com.twitter.util.Await
import com.twitter.util.Await

scala> val endpoint: Endpoint[String] = get("foo" / string) { s: String => Ok(s) }
endpoint: io.finch.Endpoint[String] = GET /foo/:string

scala> val service = endpoint.toService
service: com.twitter.finagle.Service[com.twitter.finagle.http.Request,com.twitter.finagle.http.Response] = <function1>

scala> service(Request("/foo/bar"))
res0: com.twitter.util.Future[com.twitter.finagle.http.Response] = Promise@886121853(state=Done(Return(Response("HTTP/1.1 Status(200)"))))

scala> val response = Await.result(service(Request("/foo/bar")))
response: com.twitter.finagle.http.Response = Response("HTTP/1.1 Status(200)")

scala> response.status
res1: com.twitter.finagle.http.Status = Status(200)

scala> response.contentString
res2: String = bar

ちゃんと返ってきた。問題なさそう。

参考文献