【问题标题】:Use HttpTest inside asp.net core/grpc integration test在 asp.net core/grpc 集成测试中使用 HttpTest
【发布时间】:2019-10-15 15:34:44
【问题描述】:

我有一个想要集成测试的 ASP.NET 核心/gRPC 服务。 在 grpc 服务中,我对第 3 方 Web api 进行 Flurl 调用。 我想使用 Flurl 的 HttpTest 类来模拟这些调用。 我可以让它以一种非常复杂的方式工作,但它必须更容易。

目前:

            var client = _factory
                    .WithWebHostBuilder(builder =>
                    {
                        builder.ConfigureTestServices(services =>
                        {
                        });
                    })
                .CreateClient(new WebApplicationFactoryClientOptions 
                {BaseAddress = new Uri("http://localhost:5555")});

            using var channel = GrpcChannel.ForAddress("http://localhost:5555",
                new GrpcChannelOptions { HttpClient = client });

            var grpcClient = new MyGrpcService.MyClient(channel);

            var httpTest = new HttpTest();
            var content = new StringContent("some removed json", Encoding.UTF8, "application/json");
            httpTest.RespondWith(content, 200);

...
            var resp = await grpcClient.GetSomeDataAsync(someRequest);

n.b.我正在服务中手动创建我的 IFlurlClient,因为我们需要提供依赖于主机的添加动态证书。

我的主要问题是 Flurl 是在进行真正的 HTTP 调用,而不是使用 HttpTest。

经过一番挖掘,这是由于HttpTest.Current 的静态特性。 Flurl 使用的静态HttpTest.Current 是在测试中设置的,但在服务器内部不存在。我已经设法通过FlurlClientFactoryBase 的 DI 覆盖将外部 HttpTest.ResponseQueue 中继到服务内部的一个来破解它,但这似乎远非理想。

是否有一种规范的方式来集成测试服务并让 Flurl 的 HttpTest 模拟任何传出的 HTTP 调用?

【问题讨论】:

  • 您使用的是哪个版本的 .NET Core?
  • @ToddMenier v 3.0

标签: .net-core grpc flurl


【解决方案1】:

为了让 Flurl 发出信号(对自己有效地)在 HttpTest 对象存在期间伪造所有调用,而不使用静态上下文(这可能会打乱并行测试),它需要一些上下文来流动这些来自测试的信息,通过您的 SUT,并进入 Flurl 的库位。在 .NET Core 中,执行此操作的机制是 AsyncLocal<T>,这是一个可以流向异步延续的逻辑调用上下文。

但是,默认情况下它不能流过的一个边界是TestServer。这是设计使然,正如 here 所宣布的那样。虽然我还没有尝试过,但该公告似乎暗示如果您像这样创建测试客户端,您可以让它工作:

var server = new TestServer(webHostBuilder) 
{
    PreserveExecutionContext = true;
};
var client = server.CreateClient();

【讨论】:

  • 谢谢,会测试一下。
猜你喜欢
  • 1970-01-01
  • 2018-04-10
  • 2022-06-16
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
  • 1970-01-01
相关资源
最近更新 更多