C# ASP.NET核心运行两个TestServer进行集成测试

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

我正在尝试为令牌管理API运行一些集成测试。该API还要求运行令牌颁发者API

总之,我的集成测试需要同时运行IdentityServer4 Web/API和管理API。当我创建两个
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);
}
注意: 我已经尝试过的事情:

  • 添加
    .useURL(“http://localhost:5001“”
    以查看TestServer是否将在该端口上运行
  • 添加
    serverName.BaseAddress=新Uri(“http://localhost:5001");
    查看TestServer是否将在该端口上运行

这两个问题似乎都没有影响它。

我知道这是一个老问题,但我遇到了同样的问题。我认为关键在于将从“服务器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();