【发布时间】:2017-06-20 13:10:12
【问题描述】:
我在 akka-http 应用程序中有一条路由,它通过 Http().cachedHostConnectionPoolHttps 与第三方服务集成。我想以正确的方式对其进行测试。但不确定它应该是怎样的:(
这条路线的外观如下:
val routes: Route = pathPrefix("access-tokens") {
pathPrefix(Segment) { userId =>
parameters('refreshToken) { refreshToken =>
onSuccess(accessTokenActor ? GetAccessToken(userId, refreshToken)) {
case token: AccessToken => complete(ok(token.toJson))
case AccessTokenError => complete(internalServerError("There was problems while retriving the access token"))
}
}
}
}
这条路线的后面隐藏着accessTokenActor,所有逻辑都发生在这里,它是:
class AccessTokenActor extends Actor with ActorLogging with APIConfig {
implicit val actorSystem = context.system
import context.dispatcher
implicit val materializer = ActorMaterializer()
import AccessTokenActor._
val connectionFlow = Http().cachedHostConnectionPoolHttps[String]("www.service.token.provider.com")
override def receive: Receive = {
case get: GetAccessToken => {
val senderActor = sender()
Source.fromFuture(Future.successful(
HttpRequest(
HttpMethods.GET,
"/oauth2/token",
Nil,
FormData(Map(
"clientId" -> youtubeClientId,"clientSecret" -> youtubeSecret,"refreshToken" -> get.refreshToken))
.toEntity(HttpCharsets.`UTF-8`)) -> get.channelId
)
)
.via(connectionFlow)
.map {
case (Success(resp), id) => resp.status match {
case StatusCodes.OK => Unmarshal(resp.entity).to[AccessTokenModel]
.map(senderActor ! AccessToken(_.access_token))
case _ => senderActor ! AccessTokenError
}
case _ => senderActor ! AccessTokenError
}
}.runWith(Sink.head)
case _ => log.info("Unknown message")
}
}
所以问题是如何更好地测试这条路线,记住带有流的演员也存在于它的底层。
【问题讨论】:
-
在您的测试中实例化一个模拟 Web http 服务器并接听电话?
-
@DiegoMartinoia 是的,这是最明显的情况。如果在这种情况下没有其他方法可行,我会这样做。实际上,我正在为 akka 流寻找一些测试技术。类似 Flow 用假的替换......你怎么看?
-
依赖注入和模拟的问题是,如果“真正的”依赖被破坏,您的测试不会失败。我在这方面是少数,但特别是当涉及到远程 http 调用等复杂的事情时,我喜欢把事情黑箱化。尤其是 Akka 应用程序通常会包含许多您想要测试的“奇怪”的东西(持久性、分片、集群),我发现实际旋转应用程序并在末端探测它更容易。但那是我
标签: akka akka-http akka-stream akka-testkit