ASP.NET Core运行两个TestServer进行集成测试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET Core运行两个TestServer进行集成测试相关的知识,希望对你有一定的参考价值。

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

总之,我的集成测试需要同时运行IdentityServer4 Web / API和Management API。当我创建TestServer的两个实例时,看起来他们最终都得到了相同的BaseAddresshttp://localhost)。

private readonly TestServer _identityTestServer;
private readonly TestServer _mgmtTestServer;
private readonly AppMgmtConfig _config;
private readonly AdminClient _adminClient;
private const string _certificatePassword = "test";

public AdminClientTests() : base(nameof(AdminClientTests))
{
    var connectionString = GetConnectionString();
    var dbSettings = new DbSettings(connectionString);

    Environment.SetEnvironmentVariable("IdentityServer4ConnString",
        dbSettings.IdentityServerConnectionString);
    Environment.SetEnvironmentVariable("CertificatePassword", _certificatePassword);

    _identityTestServer = new TestServer(new WebHostBuilder()
        .UseStartup<USBIdentityServer.Startup>()
        .UseEnvironment("IntegrationTest"));
    USBIdentityServer.Program.InitializeDatabase(_identityTestServer.Host);

    _mgmtTestServer = new TestServer(new WebHostBuilder()
        .UseStartup<IdentityServer4.Management.Startup>()
        .UseEnvironment("IntegrationTest"));

    _config = GetConfig();
    _adminClient = new AdminClient(_config);
}

注意:我已经尝试过的事情:

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

这些似乎都没有影响它。

答案

我知道这是一个老问题,但我遇到了同样的问题。我认为诀窍是将你从“服务器1”获得的HttpClient注入“服务器2”。

示例(.NET Core):

//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);

以上是关于ASP.NET Core运行两个TestServer进行集成测试的主要内容,如果未能解决你的问题,请参考以下文章

Web 应用程序之间的 Asp.Net Core DataProtection 无法在 Azure 上运行

深入研究 Mini ASP.NET Core(迷你 ASP.NET Core),看看 ASP.NET Core 内部到底是如何运行的

ASP.NET Core 托管捆绑包 5 是不是也可以运行 .NET/ASP.NET Core 2.1 应用程序?

c#一个解决方案里包含.netcore3.1和asp.net两个项目,能正常发布iis吗?

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 14. ASP.NET Core Identity 入门

ASP.NET Core (.NET Core) and ASP.NET Core (.NET Framework)区别