Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 在asp.net core 3.1集成测试期间在中间件中访问终结点时为空_Asp.net Core_Integration Testing - Fatal编程技术网

Asp.net core 在asp.net core 3.1集成测试期间在中间件中访问终结点时为空

Asp.net core 在asp.net core 3.1集成测试期间在中间件中访问终结点时为空,asp.net-core,integration-testing,Asp.net Core,Integration Testing,我为我的asp.net核心应用程序运行集成测试,调用从多个中间件传递,但在其中一个中间件处停止,该中间件具有以下行: var endpoint = context.Features.Get<IEndpointFeature>()?.Endpoint; var attribute = endpoint?.Metadata.GetMetadata<AllowAHeader>(); var endpoint=context.Features.Get()?.endpoint;

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

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

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");
                 });
              });

            }
        }
公共类CustomWebApplicationFactory:WebApplicationFactory
TStartup在哪里:类
{
受保护的覆盖IHostBuilder CreateHostBuilder()
{
var builder=Host.CreateDefaultBuilder()
.ConfigureWebHostDefault(x=>
{
x、 UseStartup().UseTestServer();
});
返回生成器;
}
受保护的覆盖无效配置WebHost(IWebHostBuilder)
{
var configuration=new ConfigurationBuilder()
.AddJsonFile(“appsettings.json”)
.Build();
builder.ConfigureTestServices(服务=>
{
services.RemoveAll();
services.RemoveAll();
服务中的foreach(var)选项,其中(s=>
s、 ServiceType.BaseType==
typeof(DbContextOptions)).ToList()
{
服务。移除(选项);
}
services.AddDbContext(选项=>
{
选项。使用MemoryDatabase(“测试”);
});
});
}
}
这是测试

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类ClientTests:IClassFixture
{
私有只读HttpClient\u客户端;
公共客户端测试(CustomWebApplicationFactory CustomWebApplicationFactory)
{
_client=customWebApplicationFactory.CreateClient();
}
[事实]
公共异步任务GetClients()
{
_client.DefaultRequestHeaders.Add(“X-Integration-Testing”、“True”);
_client.DefaultRequestHeaders.Add(“X-Integration-Authroize”、“Basic”);
var result=wait_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);
                }
            }
        
        }
        
    }
公共类TestStartup:Startup
{
公共测试启动(IConfiguration配置)
:基本(配置)
{
}
受保护的覆盖无效配置MiddleWareForPrintegrationTest(IApplicationBuilder应用程序)
{
app.UseMiddleware();
}
}
公共类AuthenticatedTestRequestMiddleware
{
public const string TestingHeader=“X-Integration-Testing”;
public const string TestingHeaderAuthValueValue=“X-Integration-Authroize”;
private readonly RequestDelegate\u next;
公共AuthenticatedTestRequestMiddleware(RequestDelegate下一步)
{
_下一个=下一个;
}
公共异步任务调用(HttpContext上下文)
{
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(“用户”+:“+”123456”);
context.Request.Headers.Add(“授权”,编码);
}
}
}
}

在ConfigureWebHostDefaults中添加:

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

我还没有弄清楚需要它的确切原因,但我猜这是一个bug,因为
RequestQueueMode
的值默认为0,与
RequestQueueMode相同。创建
的值。

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