【发布时间】:2016-01-11 05:47:26
【问题描述】:
我刚刚开始测试Akka HTTP Request-Level Client-Side API (Future-Based)。我一直在努力弄清楚的一件事是如何为此编写单元测试。有没有办法模拟响应并完成未来而无需实际执行 HTTP 请求?
我正在查看 API 和 testkit 包,试图了解如何使用它,结果却在文档中找到它实际上说的:
akka-http-testkit 用于验证服务器端服务实现的测试工具和实用程序集
我在想 TestServer(有点像 Akka Streams 的 TestSource)并使用服务器端路由 DSL 创建预期的响应,并以某种方式将其连接到 Http 对象。
这是我要测试的函数的简化示例:
object S3Bucket {
def sampleTextFile(uri: Uri)(
implicit akkaSystem: ActorSystem,
akkaMaterializer: ActorMaterializer
): Future[String] = {
val request = Http().singleRequest(HttpRequest(uri = uri))
request.map { response => Unmarshal(response.entity).to[String] }
}
}
【问题讨论】:
-
我没用过它,但它看起来像 Spray testkit:github.com/theiterators/akka-http-microservice/blob/master/src/…。在 Spray 中,您不必启动 Akka,只需直接针对路由进行测试(它是 PF)。
-
你指的是
freeGeoIpConnectionFlow吗?我想我在这里遗漏了一些东西。我可以看到这覆盖了AkkaHttpMicroservice 中的定义,但是如何在ServiceSpec中调用它?看来您需要致电AkkaHttpMicroservice.apply()来获取绑定。 -
有两种方法可以在Spray/AkkaHttp中测试REST API: 1)启动actor系统,就像你运行整个应用程序一样,用http客户端测试它,关闭它; 2)测试路由DSL,它本质上是一个PF,不需要actor系统来运行。我选择第二个选项,因为它更轻量级,更像单元测试与集成测试(1)。在这种情况下,我们不必绑定到网络接口,也不需要启动 Actor 来处理路由,除非您在其他地方使用 Actor。我从来没有在 AkkaHttp 上尝试过这个,从 Spray 的经验来看。
-
这是喷雾文档:spray.io/documentation/1.2.2/spray-testkit。 “对于使用 spray-routing 构建的服务,spray 提供了专用的测试 DSL,使路由逻辑的无参与者测试变得简单方便。这种“路由测试 DSL”可通过 spray-testkit 模块获得。”
-
我认为这与 akka-http-testkit 具有相同的重点。是用来测试路由的,不是用来测试客户端的。
标签: scala akka-http akka-testkit