假设我要在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] = ...
有意义吗?你会如何建议实施它?
答案 0 :(得分:3)
我会做出类似这样的行动:
def doesHeaderExist(name: String): HttpResponse => Try[HttpResponse]
def testBoxy(contents: String): HttpResponse => Try[HttpResponse]
Try
编写,所以如果它失败了,那么你最终得到的是Success
中的最终类型或{{1}中的异常(和失败的测试) }。
Failure
你处理它发生的异常。