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