C# ASP.NET核心运行两个TestServer进行集成测试
我正在尝试为令牌管理API运行一些集成测试。该API还要求运行令牌颁发者API 总之,我的集成测试需要同时运行IdentityServer4 Web/API和管理API。当我创建两个C# ASP.NET核心运行两个TestServer进行集成测试,c#,asp.net-core,integration-testing,C#,Asp.net Core,Integration Testing,我正在尝试为令牌管理API运行一些集成测试。该API还要求运行令牌颁发者API 总之,我的集成测试需要同时运行IdentityServer4 Web/API和管理API。当我创建两个TestServer实例时,它们似乎都以相同的BaseAddress(http://localhost) 专用只读测试服务器_identityTestServer; 专用只读测试服务器_mgmtTestServer; 私有只读AppMgmtConfig _config; 私有只读AdminClient\u Admin
TestServer
实例时,它们似乎都以相同的BaseAddress
(http://localhost
)
专用只读测试服务器_identityTestServer;
专用只读测试服务器_mgmtTestServer;
私有只读AppMgmtConfig _config;
私有只读AdminClient\u AdminClient;
私有常量字符串_certificatePassword=“test”;
public AdminClientTests():base(nameof(AdminClientTests))
{
var connectionString=GetConnectionString();
var dbSettings=新的dbSettings(connectionString);
setEnvironment变量(“IdentityServer4ConnString”,
dbSettings.IdentityServerConnectionString);
setEnvironment变量(“CertificatePassword”、\u CertificatePassword);
_identityTestServer=新的测试服务器(新的WebHostBuilder()
.UseStartup()
.UseEnvironment(“集成测试”);
USBIdentityServer.Program.InitializeDatabase(_identityTestServer.Host);
_mgmtTestServer=newtestserver(newwebhostbuilder()
.UseStartup()
.UseEnvironment(“集成测试”);
_config=GetConfig();
_adminClient=新的adminClient(_config);
}
注意:
我已经尝试过的事情:
- 添加
以查看TestServer是否将在该端口上运行.useURL(“http://localhost:5001“”
- 添加
查看TestServer是否将在该端口上运行serverName.BaseAddress=新Uri(“http://localhost:5001");
这两个问题似乎都没有影响它。我知道这是一个老问题,但我遇到了同样的问题。我认为关键在于将从“服务器1”获得的HttpClient注入“服务器2” 示例(.NET Core):
//启动并配置服务器1。
IWebHostBuilder server1=新的WebHostBuilder()
.UseStartup()
.UseKestrel(选项=>options.Listen(IPAddress.Any,80))
.UseConfiguration(新的ConfigurationBuilder()
.AddJsonFile(“appsettings\u server1.json”)
.Build()
);
TestServer testServer1=新的TestServer(server1);
//获取能够连接到服务器1的HttpClient。
HttpClient client1=server1.CreateClient();
IWebHostBuilder _server2=新的WebHostBuilder()
.UseStartup()
.ConfigureTestServices(
服务=>{
//注入能够连接到服务器1的HttpClient。
AddSingleton(类型为(HttpClient),客户端1);
})
.UseKestrel(选项=>options.Listen(IPAddress.Any,81))
.UseConfiguration(新的ConfigurationBuilder()
.AddJsonFile(“appsettings\u server2.json”)
.Build()
);
TestServer testServer2=新的TestServer(server2);
我正在使用.NET Core 3.1,我扩展了@Sander提供的回复
这里有两个微服务的工作解决方案:适配器和对象。
我想从适配器服务调用对象API
如果您需要一个以上的客户机,您应该将其包装在特定的客户机包装器中(在我的例子中是ObjectsApiClient),设置适当的BaseAddress,它应该可以工作
// Adapter microservice - Objects microservice client wrapper
public class ObjectsApiClient
{
private readonly HttpClient _httpClient;
public ObjectsApiClient(
HttpClient httpClient,
IAuthorizationService authorizationService, // additional services you need in your client wrapper
IHttpHeaderAppService httpHeaderAppService)
{
_httpClient = httpClient;
...
}
}
// Adapter microservice - Startup class
public void ConfigureServices(IServiceCollection services)
{
...
services.AddHttpClient<ObjectsApiClient>(client =>
{
client.BaseAddress = new Uri("http://localhost/api/v1/objects/");
})
}
// Adapter microservice integration test class
private IHost _testServer;
private IHost _objectsTestServer;
// Adapter microservice integration test constructor
_objectsTestServer = new HostBuilder()
.ConfigureWebHost(webHost =>
webHost
.UseStartup(typeof(Objects.Startup))
.UseConfiguration(configuration)
.UseTestServer())
.Start();
var objectsHttpClient = _objectsTestServer.GetTestClient();
objectsHttpClient.BaseAddress = new Uri("http://localhost/api/v1/objects/");
var objectsApiClient = new ObjectsApiClient(
objectsHttpClient,
_objectsTestServer.Services.GetService<IAuthorizationService>(), // inject services you need in your client wrapper
_objectsTestServer.Services.GetService<IHttpHeaderAppService>());
_testServer = new HostBuilder()
.ConfigureWebHost(webHost =>
webHost
.UseStartup(typeof(Startup))
.UseConfiguration(configuration)
.ConfigureTestServices(config => config
.AddSingleton(typeof(ObjectsApiClient), objectsApiClient)) // you can register other typed clients here
.UseTestServer())
.Start();
//适配器微服务-对象微服务客户端包装器
公共类ObjectsAPI客户端
{
私有只读HttpClientu HttpClient;
公共对象客户端(
HttpClient HttpClient,
IAAuthorizationService authorizationService,//客户端包装中需要的其他服务
IHttpHeaderAppService(httpHeaderAppService)
{
_httpClient=httpClient;
...
}
}
//适配器微服务-启动类
public void配置服务(IServiceCollection服务)
{
...
services.AddHttpClient(客户端=>
{
client.BaseAddress=新Uri(“http://localhost/api/v1/objects/");
})
}
//适配器微服务集成测试类
专用IHost_测试服务器;
私有IHost\u对象stServer;
//适配器微服务集成测试构造函数
_objectsTestServer=new HostBuilder()
.ConfigureWebHost(webHost=>
网络主机
.UseStartup(typeof(Objects.Startup))
.UseConfiguration(配置)
.UseTestServer())
.Start();
var objectsHttpClient=\u objectsTestServer.GetTestClient();
objectsHttpClient.BaseAddress=新Uri(“http://localhost/api/v1/objects/");
var objectsApiClient=new objectsApiClient(
objectsHttpClient,
_objectsTestServer.Services.GetService(),//在客户端包装中插入所需的服务
_objectsTestServer.Services.GetService());
_testServer=newhostbuilder()
.ConfigureWebHost(webHost=>
网络主机
.UseStartup(类型(启动))
.UseConfiguration(配置)
.ConfigureTestServices(配置=>config
.AddSingleton(typeof(ObjectsApiClient),ObjectsApiClient))//您可以在此处注册其他类型的客户端
.UseTestServer())
.Start();
您是否发现了有关此问题的任何信息?实际上,我遇到了一个非常类似的问题。不幸的是,我没有发现您如何与这些测试服务器交互?正如在我与一台服务器的集成测试中一样,我正在从myTestServer.CreateClient()
获取的HttpClient
中练习API。因此,测试服务器和(测试)客户端之间似乎存在连接我有相同的问题我有相同的问题,以及您的建议。使用URL(“)并添加serverName.BaseAddress=新Uri(”但是,对我来说,我使用的是.NET Core 3.0,所以可能有一个问题已经解决了。你知道如何处理3个测试服务器吗?你需要注入2个HttpClient以用于不同的微服务请求?因为我们没有3个测试服务器,所以我没有花太多时间来做这件事,很抱歉,但我不知道如何实现这一点s
//Start and configure server 1.
IWebHostBuilder server1 = new WebHostBuilder()
.UseStartup < Project1.Startup > ()
.UseKestrel(options => options.Listen(IPAddress.Any, 80))
.UseConfiguration(new ConfigurationBuilder()
.AddJsonFile("appsettings_server1.json")
.Build()
);
TestServer testServer1 = new TestServer(server1);
//Get HttpClient that's able to connect to server 1.
HttpClient client1 = server1.CreateClient();
IWebHostBuilder _server2 = new WebHostBuilder()
.UseStartup < Project2.Startup > ()
.ConfigureTestServices(
services => {
//Inject HttpClient that's able to connect to server 1.
services.AddSingleton(typeof(HttpClient), client1);
})
.UseKestrel(options => options.Listen(IPAddress.Any, 81))
.UseConfiguration(new ConfigurationBuilder()
.AddJsonFile("appsettings_server2.json")
.Build()
);
TestServer testServer2 = new TestServer(server2);
// Adapter microservice - Objects microservice client wrapper
public class ObjectsApiClient
{
private readonly HttpClient _httpClient;
public ObjectsApiClient(
HttpClient httpClient,
IAuthorizationService authorizationService, // additional services you need in your client wrapper
IHttpHeaderAppService httpHeaderAppService)
{
_httpClient = httpClient;
...
}
}
// Adapter microservice - Startup class
public void ConfigureServices(IServiceCollection services)
{
...
services.AddHttpClient<ObjectsApiClient>(client =>
{
client.BaseAddress = new Uri("http://localhost/api/v1/objects/");
})
}
// Adapter microservice integration test class
private IHost _testServer;
private IHost _objectsTestServer;
// Adapter microservice integration test constructor
_objectsTestServer = new HostBuilder()
.ConfigureWebHost(webHost =>
webHost
.UseStartup(typeof(Objects.Startup))
.UseConfiguration(configuration)
.UseTestServer())
.Start();
var objectsHttpClient = _objectsTestServer.GetTestClient();
objectsHttpClient.BaseAddress = new Uri("http://localhost/api/v1/objects/");
var objectsApiClient = new ObjectsApiClient(
objectsHttpClient,
_objectsTestServer.Services.GetService<IAuthorizationService>(), // inject services you need in your client wrapper
_objectsTestServer.Services.GetService<IHttpHeaderAppService>());
_testServer = new HostBuilder()
.ConfigureWebHost(webHost =>
webHost
.UseStartup(typeof(Startup))
.UseConfiguration(configuration)
.ConfigureTestServices(config => config
.AddSingleton(typeof(ObjectsApiClient), objectsApiClient)) // you can register other typed clients here
.UseTestServer())
.Start();