当前位置: 首页 > 知识库问答 >
问题:

在Scala中以一元方式测试HttpRequest

齐成和
2023-03-14

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

例如,一个响应需要具有“状态代码”= 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.

现在我需要组合它们来定义一个函数来测试响应。

我想以一元方式完成它,即定义一个monad响应测试[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个答案

沈长恨
2023-03-14

我会使操作如下所示:

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

< code > Try compose,因此如果它失败,那么您得到的要么是< code>Success中的最终类型,要么是< code>Failure中的异常(和失败的测试)。

val result = for{
 _1 <- doesHeaderExist("foo")(response)
 _2 <- testBody("bar")(_1)
} yield _2

result match{
  case Success(that) => //do stuff
  case Failure(ex) => //do stuff with the exception
}

您处理发生的异常。

 类似资料:
  • 我不熟悉Scala中的单元测试,我找不到一种方法来存根单例对象中定义的函数。 例如: 我试图对Profile类中定义的函数进行单元测试。因为我不想在单元测试中通过web实际访问外部API,所以我尝试存根对象及其函数以返回一些预定义的值。 我研究了ScalaMock、EasyMock和Mockito框架,但找不到一种方法来存根单例对象的方法。ScalaMock状态 为什么所有的模拟框架都不提供这种功

  • 我参考DataframeGenerator示例编写了单元测试,该示例允许您动态生成模拟dataframes 在成功执行以下命令后 在运行以下命令之一时,我会得到输出中显示的错误 输出 null null EDIT-1 My unit-test类包含以下几个方法 而如下所示

  • 我有很多用Java编写的cucumber .feature文件。 看起来它们是并行运行的。 我如何以单线程的方式一个接一个地运行cucumber测试? 运行测试配置为:

  • 我试图在我正在编写的脚本中测试错误处理。如果异步函数fetchBar失败,我将模式匹配失败案例,然后返回包含失败结果的成功未来。 然而,当我对这个流进行单元测试时,我在测试失败案例时遇到了麻烦。我在fetchBar上打了一个存根,以返回失败的future,如下所示。 但是我注意到fetchedBar返回的是成功而不是失败。为什么会这样,我如何存根fetchBar函数来创建一个失败的尝试?

  • 在试验并发执行时,我想知道如何实际测试它。执行流程具有副作用性质,创建未来是为了包装独立的执行/处理。 我一直在寻找一些关于如何正确单元测试的好例子,下面的场景(和是我希望测试的方法): 情景#1 情景动机 立即返回,但调用两个执行单独任务的未来(例如,保存分析并将记录存储到数据库)。这些服务调用可以被模拟,但我试图测试的是,一旦我将它们包装在s中,这两个服务都会被调用 场景#2 情景动机 从可以

  • 问题内容: 我已经看到这个问题问过其他平台/语言-有什么想法吗?我想做类似的事情: 我希望能够在调试时切换键盘输入作为脚本的开始,这样我就可以花点时间启动chrome来监听我的节点检查器端口。 ***快速更新-我猜我实际上可以使用“ process.argv”来检测–debug是否传入。这是最佳/正确的方法吗? 问题答案: 在调试模式下运行时,NodeJS创建一个全局对象: 因此,可能的解决方案是