gpt4 book ai didi

scala - 使用 WireMock 测试异步行为

转载 作者:行者123 更新时间:2023-12-05 06:42:50 25 4
gpt4 key购买 nike

我将 Akka actor 系统与 Spray 和 WireMock 一起用于 stub Web 服务。我还想验证外部 http 请求是否已经发出。

在以下用例中,向我的 Spray 服务器发出 POST 请求,该请求应向外部服务发送请求:

stubFor(get(urlEqualTo("/external-service"))
.willReturn(aResponse()
.withStatus(200)
.withBodyFile("response-body.json")));

myService ! Post("/my-service", FormData(Seq("id" -> "1")))

Thread.sleep(1000)

verify(postRequestedFor(urlEqualTo("/services/harvesterService")))

在各种示例中,我看到了 Thread.sleep 技术,否则 ActorSystem 将关闭,我的服务将永远不会为外部服务发出 http 请求。

是否可以避免这种情况? WireMock 可以等待对外部服务的请求吗?可能有一些超时...

最佳答案

注意:这假定您的 actor 在收到该消息时实际上发送了 HTTP 调用。如果你想直接测试 Spray 路线,我建议你看看 http://spray.io/documentation/1.2.3/spray-testkit/这是测试喷雾路线的标准方法。

通常我所做的是将 ScalaTest 与 Akka/Spray TestKit 一起使用,并使用 eventually 函数。 eventually 允许您反复检查最终会发生的情况。如果您捕获到 verify 方法抛出的异常,那么您可以断言该帖子是否已实际发送。你可以使用类似的东西

def postHasBeenSent(url: String): Boolean = 
try {
verify(postRequestedFor(urlEqualTo(url)))
true
} catch {
case e: VerificationException => false
}

(如果你愿意,你也可以使用 Try monad,但这不是这里的重点!)

然后在您的测试中(假设您使用的是匹配器):

myService ! Post("/my-service", FormData(Seq("id" -> "1")))

eventually {
postHasBeenSent("/my-service") shouldBe true
}

您可以在 http://doc.scalatest.org/2.2.6/index.html#org.scalatest.concurrent.Eventually 找到更多关于 eventually 以及它附带的所有好东西(例如轮询间隔)

关于scala - 使用 WireMock 测试异步行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35742023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com