gpt4 book ai didi

c# - 如何测试在启动期间设置的 Polly 重试策略?

转载 作者:行者123 更新时间:2023-12-05 04:40:56 25 4
gpt4 key购买 nike

在启动过程中,我基本上添加了一个 HttpClient,如下所示:

services.AddHttpClient<IHttpClient, MyHttpClient>().AddPolicyHandler(GetRetryPolicy());

public IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
HttpPolicyExtensions
.HandleTransientHttpError()
.OrResult(message => message.StatusCode == HttpStatusCode.NotFound)
.WaitAndRetryAsync(GetBackOffDelay(options),
onRetry: (result, timespan, retryAttempt, context) =>
{
context.GetLogger()?.LogWarning($"Failure with status code {result.Result.StatusCode}. Retry attempt {retryAttempt}. Retrying in {timespan}.");
}));
}

如何测试重试策略是否按预期工作?我试过编写这样的测试:

public async Task MyTest()
{
var policy = GetMockRetryPolicy(); // returns the policy shown above.
var content = HttpStatusCode.InternalServerError;
var services = new ServiceCollection();
services.AddHttpClient<IHttpClient, MyFakeClient>()
.AddPolicyHandler(policy);

var client = (MyFakeClient)services.BuildServiceProvider().GetRequiredService<IHttpClient>();
await client.Post(new Uri("https://someurl.com")), content);

// Some asserts that don't work right now
}

作为引用,这里是我在 MyFakeClient 上的大部分 Post 方法:

if(Enum.TryParse(content.ToString(), out HttpStatusCode statusCode))
{
if(statusCode == HttpStatusCode.InternalServerError)
{
throw new HttpResponseException(new Exception("Internal Server Error"), (int)HttpStatusCode.InternalServerError);
}
}

MyFakeClient 有一个 Post 方法来检查内容是否为 HttpStatusCode,如果是内部服务器错误则抛出一个 HttpResponseException。目前,这会创建正确的客户端并触发帖子罚款。它抛出 HttpResponseException 但这样做会退出测试而不是使用重试策略。

如何让它在测试中使用重试策略?

更新

我听从了 Peter 的建议,沿着集成测试路线走下去,并设法使用 hostbuilder 和 stub 委托(delegate)处理程序让它工作。在 stub 处理程序中,我传入了一个自定义 header ,使我能够从响应中读回重试计数。重试计数只是处理程序的一个属性,每次调用时都会增加,因此它实际上是第一次尝试,加上所有后续重试。这意味着如果重试次数为 3,您应该期望值为 4。

最佳答案

问题是你不能真正对它进行单元测试:

  1. 重试通过 DI 在 HttpClient 的顶部注册。当您进行单元测试时,您不依赖 DI,而是依赖单个组件。因此,集成测试可能更适合这种情况。我已经detailed how can you do that via WireMock.Net .基本思想是创建一个具有预定义响应序列的本地 http 服务器(模拟下游系统)。
  2. 在您定义了重试策略(使用重试次数时间惩罚)之后,您将无法轻松检索它们。因此,从单元测试的角度来看,确实很难确保策略已被正确定义(比如延迟以秒为单位指定,而不是以分钟为单位)。我已经创建了一个 github issue for that ,可惜新版本的开发一直卡住了。

关于c# - 如何测试在启动期间设置的 Polly 重试策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70172462/

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