diff options
author | David Fowler <davidfowl@gmail.com> | 2021-07-26 08:59:36 +0300 |
---|---|---|
committer | David Fowler <davidfowl@gmail.com> | 2021-07-26 08:59:36 +0300 |
commit | aa6c3d27eabfd781bae8d5157d50e1b8eaaf96f0 (patch) | |
tree | 2d09d8d747df4b8f7bb5fa79005e9ebf517737b3 | |
parent | 2be49d930a5fb53e781abd175c3b2a8f8b7827d4 (diff) |
Make WebApplicationFactory worked with other IServersdavidfowl/waf-with-servers
- Don't assume the TestServer is the only IServer implementation that works with the WebApplicationFactory. Fix CreateClient to handle HttpClient creation for different kinds of IServer implementations by getting the IServerAddressesFeature and populating the HttpClient with that URL (preferring http or https).
-rw-r--r-- | src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs | 46 |
1 files changed, 35 insertions, 11 deletions
diff --git a/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs b/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs index a0f306e5e7..7fbe8273fb 100644 --- a/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs +++ b/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs @@ -12,6 +12,7 @@ using System.Text.Json; using System.Threading.Tasks; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting.Server; +using Microsoft.AspNetCore.Hosting.Server.Features; using Microsoft.AspNetCore.TestHost; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyModel; @@ -28,7 +29,7 @@ namespace Microsoft.AspNetCore.Mvc.Testing { private bool _disposed; private bool _disposedAsync; - private TestServer? _server; + private IServer? _server; private IHost? _host; private Action<IWebHostBuilder> _configuration; private readonly List<HttpClient> _clients = new(); @@ -78,7 +79,7 @@ namespace Microsoft.AspNetCore.Mvc.Testing get { EnsureServer(); - return _server; + return _server as TestServer ?? throw new InvalidOperationException("Server is not a TestServer"); } } @@ -90,7 +91,7 @@ namespace Microsoft.AspNetCore.Mvc.Testing get { EnsureServer(); - return _host?.Services ?? _server.Host.Services; + return _host?.Services ?? (_server is TestServer testServer ? testServer.Host.Services : throw new InvalidOperationException("Unable to resolve IServiceProvider")); } } @@ -198,11 +199,11 @@ namespace Microsoft.AspNetCore.Mvc.Testing hostBuilder.ConfigureWebHost(webHostBuilder => { SetContentRoot(webHostBuilder); + webHostBuilder.UseTestServer(); // Set the server first so it can be modified by the configuration callback _configuration(webHostBuilder); - webHostBuilder.UseTestServer(); }); _host = CreateHost(hostBuilder); - _server = (TestServer)_host.Services.GetRequiredService<IServer>(); + _server = _host.Services.GetRequiredService<IServer>(); } private void SetContentRoot(IWebHostBuilder builder) @@ -466,10 +467,34 @@ namespace Microsoft.AspNetCore.Mvc.Testing { EnsureServer(); + (HttpMessageHandler, Uri?) CreateHandler() + { + if (_server is null) + { + throw new InvalidOperationException("Server not available"); + } + + if (_server is TestServer testServer) + { + return (testServer.CreateHandler(), null); + } + + var httpAddress = _server.Features.Get<IServerAddressesFeature>()?.Addresses.FirstOrDefault(a => a.StartsWith("http://")); + + if (httpAddress is null) + { + throw new InvalidOperationException("Unable to find HTTP address"); + } + + return (new HttpClientHandler(), new Uri(httpAddress)); + } + + var (handler, uri) = CreateHandler(); + HttpClient client; if (handlers == null || handlers.Length == 0) { - client = _server.CreateClient(); + client = new HttpClient(handler) { BaseAddress = uri }; } else { @@ -478,10 +503,9 @@ namespace Microsoft.AspNetCore.Mvc.Testing handlers[i - 1].InnerHandler = handlers[i]; } - var serverHandler = _server.CreateHandler(); - handlers[^1].InnerHandler = serverHandler; + handlers[^1].InnerHandler = handler; - client = new HttpClient(handlers[0]); + client = new HttpClient(handlers[0]) { BaseAddress = uri }; } _clients.Add(client); @@ -502,7 +526,7 @@ namespace Microsoft.AspNetCore.Mvc.Testing throw new ArgumentNullException(nameof(client)); } - client.BaseAddress = new Uri("http://localhost"); + client.BaseAddress ??= new Uri("http://localhost"); } /// <summary> @@ -516,7 +540,7 @@ namespace Microsoft.AspNetCore.Mvc.Testing public HttpClient CreateDefaultClient(Uri baseAddress, params DelegatingHandler[] handlers) { var client = CreateDefaultClient(handlers); - client.BaseAddress = baseAddress; + client.BaseAddress ??= baseAddress; return client; } |