2

我想测试一个 Http4sClient正在从我的类中调用ClassUnderTest(以发出 HTTP 请求)并且发出的请求包含我期望的标头。

0.18.x中,我做了类似下面的事情。使用副作用来存储标头的值,以便我可以在调用后进行断言。在下面的示例中,f.execute(...)预计将PUTclient实例一起创建,并且我正在尝试记录所有请求处理和存储标头。

  "Request has headers" >> {

    var headers = List[String]()

    val client = Client[IO](new Kleisli[IO, Request[IO], DisposableResponse[IO]](request => {
      headers = request.headers.map(_.name.toString()).toList
      Ok().map(DisposableResponse(_, IO.pure(())))
    }), IO.pure(()))

    val f = ClassUnderTest(client)
    f.execute("example")

    headers must_== List(
      "Content-Type",
      "X-Forwarded-For",
      "Content-Length"
    )
  }

真正的代码在这里,如果你有兴趣。

ClassUnderTest花了一个Client[IO]所以我可以得到上述工作。

class ClassUnderTest(client: http4s.Client[IO])

在 Http4s 0.20.12中,我不得不将签名更改为:

class ClassUnderTest(client: Resource[IO, http4s.Client[IO]])

...现在我不知道如何为测试存根客户端。我尝试过,JavaNetClientBuilder但这无济于事,因为我可以获得Client(after .create) 的实例,现在我需要一个Resource[IO, http4s.Client[IO]].

如何使用测试替身来代替Client/Resource[F, Client[F]]以便我可以测试它发出的请求?

文档上的测试页面并没有真正帮助我。我想要一个测试替身,而不是测试所有功能Service(我不想启动服务器)。

4

0 回答 0