在Scala中以游牧方式测试Http请求

时间:2014-01-24 20:51:58

标签: scala functional-programming monads

假设我要在Scala中测试HTTP响应,以确保我的Web应用程序根据需要返回它们。

例如,一个响应需要具有“status code”= Ok,“content-type:application / json”和“content-length”标头以及一个有效的JSON主体,另一个需要具有“状态代码” “=错误请求和错误消息等

假设我已经定义了一些函数来测试状态,标题和正文

 def testStatus(status:Status): HttpResponse => Either[String, Status] = ...
 def doesHeaderExist(name: String): HttpResponse => Either[String, Header] = ...
 def testBody(body: Body): HttpResponse => Either[String, Body] = ...

 ... // etc.

现在我需要撰写来定义一个测试响应的函数。

我想以 monadic 方式执行此操作,即定义 monad ResponseTest[A]

case class ResponseTest[A](req: HttpResponse, ea: Either[String, A]) {
  def unit(resp: HttpResponse, a: A) = ...
  def flatMap(f: A => ResponseTest[B]): ResponseTest[B] = ... 
}

重新定义测试函数以返回ResponseTest并使用flatMap组合它们以定义测试整个响应的函数

  val testErrorResponse: HttpResponse => ResponseTest[HttpResponse] = ...
  val testJsonResponse: HttpResponse => ResponseTest[HttpResponse] = ...

有意义吗?你会如何建议实施它?

1 个答案:

答案 0 :(得分:3)

我会做出类似这样的行动:

def doesHeaderExist(name: String): HttpResponse => Try[HttpResponse]
def testBoxy(contents: String): HttpResponse => Try[HttpResponse]

Try编写,所以如果它失败了,那么你最终得到的是Success中的最终类型或{{1}中的异常(和失败的测试) }。

Failure

你处理它发生的异常。