【问题标题】:Endpoint is null when accessed in middleware during asp.net core 3.1 integration test在 asp.net core 3.1 集成测试期间在中间件中访问时端点为空
【发布时间】:2021-02-04 15:24:25
【问题描述】:

我为我的 asp.net 核心应用程序运行集成测试,调用从多个中间件传递,但在其中一个具有以下行时停止:

var endpoint = context.Features.Get<IEndpointFeature>()?.Endpoint;
var attribute = endpoint?.Metadata.GetMetadata<AllowAHeader>();

端点为空。

public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup>
            where TStartup : class
        {
            protected override IHostBuilder CreateHostBuilder()
            {
                var builder = Host.CreateDefaultBuilder()
                                  .ConfigureWebHostDefaults(x =>
                                  {
                                      x.UseStartup<TStartup>().UseTestServer();
                                  });
                return builder;
            }
    
            protected override void ConfigureWebHost(IWebHostBuilder builder)
            {
                var configuration = new ConfigurationBuilder()
                    .AddJsonFile("appsettings.json")
                    .Build();

               builder.ConfigureTestServices(services =>
               {
                   services.RemoveAll<DbContext>();
                   services.RemoveAll<DbContextOptions>();

                   foreach (var option in services.Where(s => 
                   s.ServiceType.BaseType == 
                       typeof(DbContextOptions)).ToList())
                  {
                    services.Remove(option);
                  }

                  services.AddDbContext<DbContext>(options =>
                 {
                   options.UseInMemoryDatabase("Testing");
                 });
              });

            }
        }

这是测试

public class ClientTests : IClassFixture<CustomWebApplicationFactory<TestStartup>>
    {
        private readonly HttpClient _client;

        public ClientTests(CustomWebApplicationFactory<TestStartup> customWebApplicationFactory)
        {
            _client = customWebApplicationFactory.CreateClient();
        }

        [Fact]
        public async Task GetClients()
        {
            _client.DefaultRequestHeaders.Add("X-Integration-Testing", "True");
            _client.DefaultRequestHeaders.Add("X-Integration-Authroize", "Basic");

            var result = await _client.PostAsync("v1/client", null);
        }
    }

测试启动:

public class TestStartup : Startup
    {
        public TestStartup(IConfiguration configuration)
            : base(configuration)
        {
        }

        protected override void ConfigureMiddlewareForIntegrationTest(IApplicationBuilder app)
        {
            app.UseMiddleware<AuthenticatedTestRequestMiddleware>();
        }
    }


 public class AuthenticatedTestRequestMiddleware
    {
        public const string TestingHeader = "X-Integration-Testing";
        public const string TestingHeaderAuthValueValue = "X-Integration-Authroize";

        private readonly RequestDelegate _next;

        public AuthenticatedTestRequestMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
        
            if (context.Request.Headers.Keys.Contains(TestingHeader))
            {
                 if (context.Request.Headers.Keys.Contains(TestingHeaderAuthValueValue))
                {
                    var encoded = "Basic " + System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes("user" + ":" + "123456"));
                    context.Request.Headers.Add("Authorization", encoded);
                }
            }
        
        }
        
    }

【问题讨论】:

  • 如果我们不知道您的测试是如何配置的,或者没有看到任何相关代码,我们该如何提供帮助?
  • @DavidG 代码在第一次编辑时丢失,已添加。

标签: asp.net-core integration-testing


【解决方案1】:

在 ConfigureWebHostDefaults 添加:

x.UseHttpSys(opt => 
    opt.RequestQueueMode = RequestQueueMode.Create;
)

还没有弄清楚为什么需要它,但我猜这是一个错误,因为 RequestQueueMode 的值默认为 0,与 RequestQueueMode.Create 的值相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-21
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2020-07-13
    • 1970-01-01
    • 2020-07-02
    相关资源
    最近更新 更多