【发布时间】: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