Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.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
C# 用于使用xUnit测试API端点的HostBuilder设置_C#_Api_Integration Testing_Xunit.net_.net Core 3.1 - Fatal编程技术网

C# 用于使用xUnit测试API端点的HostBuilder设置

C# 用于使用xUnit测试API端点的HostBuilder设置,c#,api,integration-testing,xunit.net,.net-core-3.1,C#,Api,Integration Testing,Xunit.net,.net Core 3.1,我想知道是否有人能帮助我,我已经为一个问题挣扎了很多天,并遵循了一些例子,但它们似乎都不起作用。基本上,我正在寻找一种生成HTTP请求的方法,例如,一个GET请求来测试用.net core 3.1创建的web API的端点,我本以为这很简单,但我似乎遗漏了一些东西,创建了一个简单的测试服务器 [Fact] public async Task ShouldReturnHelloWorld() { var hostBuilder = new HostBuilder() .Co

我想知道是否有人能帮助我,我已经为一个问题挣扎了很多天,并遵循了一些例子,但它们似乎都不起作用。基本上,我正在寻找一种生成HTTP请求的方法,例如,一个GET请求来测试用.net core 3.1创建的web API的端点,我本以为这很简单,但我似乎遗漏了一些东西,创建了一个简单的测试服务器

[Fact]
public async Task ShouldReturnHelloWorld()
{
    var hostBuilder = new HostBuilder()
        .ConfigureWebHost(webHost =>
        {
            // Add TestServer
            webHost.UseTestServer();
            webHost.Configure(app => app.Run(async ctx => 
                await ctx.Response.WriteAsync("Hello World!")));
        });

    // Build and start the IHost
    var host = await hostBuilder.StartAsync();

    // Create an HttpClient to send requests to the TestServer
    var client = host.GetTestClient();

    var response = await client.GetAsync("/");

    response.EnsureSuccessStatusCode();
    var responseString = await response.Content.ReadAsStringAsync();
    Assert.Equal("Hello World!", responseString);
}
然而,当我进行下一步为API创建测试服务器时,我不断发现连接被拒绝或超时。现在我认为这通常有两个原因,本地主机URL错误或与防火墙相关,但事实并非如此。我在WebAPI中检查了我的启动文件,没有任何东西可以阻止它运行,如果有,我如何才能正常运行它。如果有人能帮忙的话,请看下面我的类我正在尝试为测试创建一个测试服务器。这是与服务器相关的原因,我无法让服务器运行下面这样的运行状况检查,这些检查确实正常运行API

    [Collection(TestCollectionDefinition.Api)]
    public class HostBuilderTest 
    {

        [Fact]
        public void IsApiHealthy()
        {
            var setup = new Infrastructure.InfrastructureSetup();
            var response = setup.HealthCheck();
            response.IsSuccessStatusCode.Should().BeTrue();
        }
}
和测试服务器:

[CollectionDefinition(Api)]
public class TestCollectionDefinition : ICollectionFixture<InfrastructureSetup>
{
    public const string Api = "Api";
}

public class InfrastructureSetup : IDisposable
{

    protected internal const string AutomationEnv = "Development";

    private static void SetEnvironmentVariable()
    {
        var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

        Console.WriteLine($"ASPNETCORE_ENVIRONMENT > {env}");

        if (string.IsNullOrEmpty(env))
        {
            Console.WriteLine($"Setting env variable to {AutomationEnv}!");
            Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", AutomationEnv);
        }
    }

    private readonly CancellationTokenSource _cancel = new CancellationTokenSource();
    private IHost _host;
    public InfrastructureSetup()
    {
        SetEnvironmentVariable();

        Task.Factory.StartNew(() =>
        {
            //From the API (Program)
            var hostBuilder = Program.CreateHostBuilder(null);

            _host = hostBuilder.Build();

            try
            {
                _host.StartAsync(_cancel.Token);
                Task.Delay(Timeout.Infinite, _cancel.Token).Wait(_cancel.Token);
            }
            catch (OperationCanceledException)
            {
                Console.WriteLine("Operation cancelled!");
            }

        }, _cancel.Token, TaskCreationOptions.LongRunning, TaskScheduler.Current);

        Task.Delay(TimeSpan.FromSeconds(15)).Wait(); //wait for server to start
    }

    public void Dispose()
    {
        _host?.StopAsync(_cancel.Token)
            .Wait(TimeSpan.FromSeconds(15));
        _cancel?.Cancel();
        _cancel?.Dispose();
    }
}
[集合定义(Api)]
公共类TestCollectionDefinition:ICollectionFixture
{
公共常量字符串Api=“Api”;
}
公共类基础结构设置:IDisposable
{
受保护的内部常量字符串AutomationEnv=“Development”;
私有静态void SetEnvironmentVariable()
{
var env=Environment.GetEnvironmentVariable(“ASPNETCORE_环境”);
Console.WriteLine($“ASPNETCORE_ENVIRONMENT>{env}”);
if(string.IsNullOrEmpty(env))
{
WriteLine($“将环境变量设置为{AutomationEnv}!”);
setEnvironment变量(“ASPNETCORE_环境”,automationEnvironment);
}
}
private readonly CancellationTokenSource _cancel=new CancellationTokenSource();
专用IHost_主机;
公共基础设施设置()
{
SetEnvironmentVariable();
Task.Factory.StartNew(()=>
{
//来自API(程序)
var hostBuilder=Program.CreateHostBuilder(null);
_host=hostBuilder.Build();
尝试
{
_host.StartAsync(_cancel.Token);
Task.Delay(Timeout.Infinite,_cancel.Token).Wait(_cancel.Token);
}
捕获(操作取消异常)
{
Console.WriteLine(“操作已取消!”);
}
},_cancel.Token、TaskCreationOptions.LongRunning、TaskScheduler.Current);
Task.Delay(TimeSpan.FromSeconds(15)).Wait();//等待服务器启动
}
公共空间处置()
{
_主机?.StopAsync(\u cancel.Token)
.等待(时间跨度从秒(15));
_取消?.cancel();
_取消?.Dispose();
}
}