【发布时间】:2021-07-26 15:54:19
【问题描述】:
问题 stmt:由于服务器问题,我有一个服务有时会从 graphql 获取结果,该服务可能会抛出 500 错误
解决方案:为了解决上述问题,我需要编写一个重试逻辑来在发生超时时重试服务。
障碍:我不知道如何断言给定的逻辑是否按照指定的方式调用了服务 3 次。任何帮助表示赞赏。
我创建了一个重试策略,以在给定客户端超时后重试。
public override void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient<GraphQueryService>(Constants.PPQClient)
.ConfigureHttpClient(client =>
{
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.Timeout = TimeSpan.FromMilliseconds(Constants.ClientTimeOut);
}).AddRetryPolicy();
}
重试逻辑:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Polly;
namespace PA.Com.Integration
{
public static class HttpClientBuilderExtensions
{
public static IHttpClientBuilder AddRetryPolicy(this IHttpClientBuilder builder)
{
var serviceProvider = builder.Services.BuildServiceProvider();
var options = serviceProvider.GetRequiredService<IOptions<RetryOptions>>();
return builder.AddTransientHttpErrorPolicy(b => b.WaitAndRetryAsync(new[]
{
options.Value.RetryDelay1,
options.Value.RetryDelay2,
options.Value.RetryDelay3
}));
}
}
}
我是单元测试的新手,我相信我调用了代码来检查超时,但不确定如何断言它是否在超时时被调用了三次。
我试过的单元测试:
[Fact]
public async Task Check_Whether_Given_Policy_Executed_OnTimeout()
{
// Given / Arrange
IServiceCollection services = new ServiceCollection();
bool retryCalled = false;
HttpStatusCode codeHandledByPolicy = HttpStatusCode.InternalServerError;
var data = services.AddHttpClient<GraphQueryService>(Constants.PPQClient)
.ConfigureHttpClient(client =>
{
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.Timeout = TimeSpan.FromMilliseconds(Constants.ClientTimeOut);
}).AddRetryPolicy()
.AddHttpMessageHandler(() => new StubDelegatingHandler(codeHandledByPolicy));
//Need to Check the retry logic is called three times. Not sure How to continue after this.
Assert.Equal(codeHandledByPolicy, HttpStatusCode.InternalServerError);
Assert.True(retryCalled);
}
【问题讨论】:
-
AddRetryPolicy来自哪里。你在跟随一个例子吗?尽量避免自己构建服务提供者。 -
@Nkosi 你是在询问 configureclient().AddRetryPolicy 这行吗?我认为它会调用我在 HttpClientBuilderExtensions.cs 下实现的重试策略。不确定它是否能满足我的要求。
标签: c# unit-testing polly