У меня есть служба ядра ASP.NET / gRPC, которую я хочу проверить на интеграцию. Внутри сервисов grpc я делаю Flurl звонки на сторонние веб-интерфейсы. Я хочу издеваться над этими вызовами с помощью класса Flttl 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);
nb Я создаю свой IFlurlClient вручную внутри службы, поскольку мы должны предоставитьдобавить динамический сертификат в зависимости от хоста.
Моя главная проблема заключается в том, что Flurl выполняет реальные HTTP-вызовы, а не использует HttpTest.
После некоторого копания это связано со статическим характером HttpTest.Current
. Статический HttpTest.Current
, который использует Flurl, настраивается в тесте, но не существует внутри сервера. Мне удалось взломать его работу путем передачи внешнего HttpTest.ResponseQueue одному внутри службы через переопределение DI FlurlClientFactoryBase
, но это кажется далеко от идеала.
Есть ли канонический способ тестирования интеграцииобслуживание и наличие HttpTest Flurl's макет каких-либо исходящих HTTP-вызовов?