首页 > 解决方案 > .net 5.0 集成测试,未找到健康检查端点

问题描述

我正在尝试测试运行状况检查端点。

我已经使用 .net core 和 WebApplicationFactory 和 TestServer 实现了集成测试,以测试我的 API 端点。

我编写了测试用例(xUnit)来测试我的 API 端点,简单的 API 控制器工作得很好,但是没有找到健康检查端点——它不是控制器,它是一个可配置的端点

这是服务配置

services.AddHealthChecks().AddCheck<PingHealthCheck>("ping_health_check");

这是配置

  endpoints.MapHealthChecks("/health", new HealthCheckOptions()
    {
        // Prevent response caching
        AllowCachingResponses = false,
        ResponseWriter = (context, report) => context.Response
            //Return an object instead of a plain text
            .WriteAsync(JsonConvert.SerializeObject(new {status= report.Status.ToString() })),
        ResultStatusCodes =
            {
                [HealthStatus.Healthy] = StatusCodes.Status200OK,
                [HealthStatus.Degraded] = StatusCodes.Status200OK,
                [HealthStatus.Unhealthy] = StatusCodes.Status503ServiceUnavailable
            }
    })

这是测试用例

[Fact]
public async Task Call_Health_Return_Healthy()
{
    //Arrange 
    //Act
    var response = await _factory.TestHttpClient
        .GetAsync("/health");
    //Assert
    response.StatusCode.Should().BeEquivalentTo(HttpStatusCode.OK);
}

标签: c#.net-coreintegration-testinghealth-check

解决方案


我成功解决了我的问题。原因是允许哪些主机访问健康端点的配置。

问题是,我将访问(在 localhost 中)限制为端口 5001,但 ApplicationFactory 中的 TestServer 没有任何端口。

下面是配置代码

        /// <summary>
        /// Configures the endpoint.
        /// </summary>
        /// <param name="builder">The application builder. <see cref="IApplicationBuilder"/></param>
        /// <param name="configuration">The IConfiguration builder instance</param>
        public static void ConfigureEndpoint(this IApplicationBuilder builder, IConfiguration configuration)
        {
            var healthConfiguration = configuration.GetSection(nameof(HealthConfiguration)).Get<HealthConfiguration>();
            builder.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                endpoints.MapHealthChecks("/health", new HealthCheckOptions()
                {
                    // Prevent response caching
                    AllowCachingResponses = false,
                    ResponseWriter = (context, report) => context.Response
                        //Return an object instead of a plain text
                        .WriteAsync(JsonConvert.SerializeObject(new {status = report.Status.ToString()})),
                    ResultStatusCodes =
                    {
                        [HealthStatus.Healthy] = StatusCodes.Status200OK,
                        [HealthStatus.Degraded] = StatusCodes.Status200OK,
                        [HealthStatus.Unhealthy] = StatusCodes.Status503ServiceUnavailable
                    }
                }).RequireHost(string.Join(",",healthConfiguration.Hosts.Select(host=>host)));
            });
        }

而配置部分更改为

 "HealthConfiguration": {
    "Hosts": ["localhost"] 
  },

推荐阅读