Skip to content

Commit 2508dfc

Browse files
huysentruitwTratcher
authored andcommitted
Expose TestServer as public property on RequestBuilder #5947 (#10396)
1 parent 4e4ccdd commit 2508dfc

File tree

5 files changed

+101
-23
lines changed

5 files changed

+101
-23
lines changed

src/Hosting/TestHost/ref/Microsoft.AspNetCore.TestHost.netcoreapp3.0.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public static partial class HostBuilderTestServerExtensions
1717
public partial class RequestBuilder
1818
{
1919
public RequestBuilder(Microsoft.AspNetCore.TestHost.TestServer server, string path) { }
20+
public Microsoft.AspNetCore.TestHost.TestServer TestServer { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
2021
public Microsoft.AspNetCore.TestHost.RequestBuilder AddHeader(string name, string value) { throw null; }
2122
public Microsoft.AspNetCore.TestHost.RequestBuilder And(System.Action<System.Net.Http.HttpRequestMessage> configure) { throw null; }
2223
public System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage> GetAsync() { throw null; }
@@ -25,15 +26,16 @@ public RequestBuilder(Microsoft.AspNetCore.TestHost.TestServer server, string pa
2526
}
2627
public partial class TestServer : Microsoft.AspNetCore.Hosting.Server.IServer, System.IDisposable
2728
{
28-
public TestServer() { }
2929
public TestServer(Microsoft.AspNetCore.Hosting.IWebHostBuilder builder) { }
3030
public TestServer(Microsoft.AspNetCore.Hosting.IWebHostBuilder builder, Microsoft.AspNetCore.Http.Features.IFeatureCollection featureCollection) { }
31-
public TestServer(Microsoft.AspNetCore.Http.Features.IFeatureCollection featureCollection) { }
31+
public TestServer(System.IServiceProvider services) { }
32+
public TestServer(System.IServiceProvider services, Microsoft.AspNetCore.Http.Features.IFeatureCollection featureCollection) { }
3233
public bool AllowSynchronousIO { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
3334
public System.Uri BaseAddress { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
3435
public Microsoft.AspNetCore.Http.Features.IFeatureCollection Features { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
3536
public Microsoft.AspNetCore.Hosting.IWebHost Host { get { throw null; } }
3637
public bool PreserveExecutionContext { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
38+
public System.IServiceProvider Services { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
3739
public System.Net.Http.HttpClient CreateClient() { throw null; }
3840
public System.Net.Http.HttpMessageHandler CreateHandler() { throw null; }
3941
public Microsoft.AspNetCore.TestHost.RequestBuilder CreateRequest(string path) { throw null; }

src/Hosting/TestHost/src/RequestBuilder.cs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ namespace Microsoft.AspNetCore.TestHost
1313
/// </summary>
1414
public class RequestBuilder
1515
{
16-
private readonly TestServer _server;
1716
private readonly HttpRequestMessage _req;
1817

1918
/// <summary>
@@ -23,15 +22,15 @@ public class RequestBuilder
2322
/// <param name="path"></param>
2423
public RequestBuilder(TestServer server, string path)
2524
{
26-
if (server == null)
27-
{
28-
throw new ArgumentNullException(nameof(server));
29-
}
30-
31-
_server = server;
25+
TestServer = server ?? throw new ArgumentNullException(nameof(server));
3226
_req = new HttpRequestMessage(HttpMethod.Get, path);
3327
}
3428

29+
/// <summary>
30+
/// Gets the <see cref="TestServer"/> instance for which the request is being built.
31+
/// </summary>
32+
public TestServer TestServer { get; }
33+
3534
/// <summary>
3635
/// Configure any HttpRequestMessage properties.
3736
/// </summary>
@@ -79,7 +78,7 @@ public RequestBuilder AddHeader(string name, string value)
7978
public Task<HttpResponseMessage> SendAsync(string method)
8079
{
8180
_req.Method = new HttpMethod(method);
82-
return _server.CreateClient().SendAsync(_req);
81+
return TestServer.CreateClient().SendAsync(_req);
8382
}
8483

8584
/// <summary>
@@ -89,7 +88,7 @@ public Task<HttpResponseMessage> SendAsync(string method)
8988
public Task<HttpResponseMessage> GetAsync()
9089
{
9190
_req.Method = HttpMethod.Get;
92-
return _server.CreateClient().SendAsync(_req);
91+
return TestServer.CreateClient().SendAsync(_req);
9392
}
9493

9594
/// <summary>
@@ -99,7 +98,7 @@ public Task<HttpResponseMessage> GetAsync()
9998
public Task<HttpResponseMessage> PostAsync()
10099
{
101100
_req.Method = HttpMethod.Post;
102-
return _server.CreateClient().SendAsync(_req);
101+
return TestServer.CreateClient().SendAsync(_req);
103102
}
104103
}
105104
}

src/Hosting/TestHost/src/TestServer.cs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using Microsoft.AspNetCore.Hosting.Server;
1010
using Microsoft.AspNetCore.Http;
1111
using Microsoft.AspNetCore.Http.Features;
12+
using Microsoft.Extensions.DependencyInjection;
1213

1314
namespace Microsoft.AspNetCore.TestHost
1415
{
@@ -19,19 +20,22 @@ public class TestServer : IServer
1920
private ApplicationWrapper _application;
2021

2122
/// <summary>
22-
/// For use with IHostBuilder or IWebHostBuilder.
23+
/// For use with IHostBuilder.
2324
/// </summary>
24-
public TestServer()
25-
: this(new FeatureCollection())
25+
/// <param name="services"></param>
26+
public TestServer(IServiceProvider services)
27+
: this(services, new FeatureCollection())
2628
{
2729
}
2830

2931
/// <summary>
30-
/// For use with IHostBuilder or IWebHostBuilder.
32+
/// For use with IHostBuilder.
3133
/// </summary>
34+
/// <param name="services"></param>
3235
/// <param name="featureCollection"></param>
33-
public TestServer(IFeatureCollection featureCollection)
36+
public TestServer(IServiceProvider services, IFeatureCollection featureCollection)
3437
{
38+
Services = services ?? throw new ArgumentNullException(nameof(services));
3539
Features = featureCollection ?? throw new ArgumentNullException(nameof(featureCollection));
3640
}
3741

@@ -50,16 +54,19 @@ public TestServer(IWebHostBuilder builder)
5054
/// <param name="builder"></param>
5155
/// <param name="featureCollection"></param>
5256
public TestServer(IWebHostBuilder builder, IFeatureCollection featureCollection)
53-
: this(featureCollection)
5457
{
5558
if (builder == null)
5659
{
5760
throw new ArgumentNullException(nameof(builder));
5861
}
5962

63+
Features = featureCollection ?? throw new ArgumentNullException(nameof(featureCollection));
64+
6065
var host = builder.UseServer(this).Build();
6166
host.StartAsync().GetAwaiter().GetResult();
6267
_hostInstance = host;
68+
69+
Services = host.Services;
6370
}
6471

6572
public Uri BaseAddress { get; set; } = new Uri("http://localhost/");
@@ -73,6 +80,8 @@ public IWebHost Host
7380
}
7481
}
7582

83+
public IServiceProvider Services { get; }
84+
7685
public IFeatureCollection Features { get; }
7786

7887
/// <summary>

src/Hosting/TestHost/test/RequestBuilderTests.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,19 @@ public void AddContentHeaders()
3434
Assert.Equal("Test/Value", request.Content.Headers.ContentType.ToString());
3535
});
3636
}
37+
38+
[Fact]
39+
public void TestServer_PropertyShouldHoldTestServerInstance()
40+
{
41+
// Arrange
42+
var builder = new WebHostBuilder().Configure(app => { });
43+
var server = new TestServer(builder);
44+
45+
// Act
46+
var requestBuilder = server.CreateRequest("/");
47+
48+
// Assert
49+
Assert.Equal(server, requestBuilder.TestServer);
50+
}
3751
}
3852
}

src/Hosting/TestHost/test/TestServerTests.cs

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
using System.Threading.Tasks;
1212
using Microsoft.AspNetCore.Builder;
1313
using Microsoft.AspNetCore.Hosting;
14+
using Microsoft.AspNetCore.Hosting.Server;
1415
using Microsoft.AspNetCore.Hosting.Server.Features;
1516
using Microsoft.AspNetCore.Http;
1617
using Microsoft.AspNetCore.Http.Features;
17-
using Microsoft.AspNetCore.Testing.xunit;
1818
using Microsoft.Extensions.DependencyInjection;
1919
using Microsoft.Extensions.DiagnosticAdapter;
2020
using Microsoft.Extensions.Hosting;
@@ -28,20 +28,22 @@ namespace Microsoft.AspNetCore.TestHost
2828
public class TestServerTests
2929
{
3030
[Fact]
31-
public async Task GenericRawCreate()
31+
public async Task GenericRawCreateAndStartHost_GetTestServer()
3232
{
33-
var server = new TestServer();
3433
using var host = new HostBuilder()
3534
.ConfigureWebHost(webBuilder =>
3635
{
3736
webBuilder
38-
.UseServer(server)
37+
.ConfigureServices(services =>
38+
{
39+
services.AddSingleton<IServer>(serviceProvider => new TestServer(serviceProvider));
40+
})
3941
.Configure(app => { });
4042
})
4143
.Build();
4244
await host.StartAsync();
4345

44-
var response = await server.CreateClient().GetAsync("/");
46+
var response = await host.GetTestServer().CreateClient().GetAsync("/");
4547
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
4648
}
4749

@@ -278,6 +280,58 @@ public void TestServerConstructorWithNullFeatureCollectionThrows()
278280
Assert.Throws<ArgumentNullException>(() => new TestServer(builder, null));
279281
}
280282

283+
[Fact]
284+
public void TestServerConstructorShouldProvideServicesFromPassedServiceProvider()
285+
{
286+
// Arrange
287+
var serviceProvider = new ServiceCollection().BuildServiceProvider();
288+
289+
// Act
290+
var testServer = new TestServer(serviceProvider);
291+
292+
// Assert
293+
Assert.Equal(serviceProvider, testServer.Services);
294+
}
295+
296+
[Fact]
297+
public void TestServerConstructorShouldProvideServicesFromWebHost()
298+
{
299+
// Arrange
300+
var testService = new TestService();
301+
var builder = new WebHostBuilder()
302+
.ConfigureServices(services => services.AddSingleton(testService))
303+
.Configure(_ => { });
304+
305+
// Act
306+
var testServer = new TestServer(builder);
307+
308+
// Assert
309+
Assert.Equal(testService, testServer.Services.GetService<TestService>());
310+
}
311+
312+
[Fact]
313+
public async Task TestServerConstructorShouldProvideServicesFromHostBuilder()
314+
{
315+
// Arrange
316+
var testService = new TestService();
317+
using var host = await new HostBuilder()
318+
.ConfigureWebHost(webBuilder =>
319+
{
320+
webBuilder
321+
.UseTestServer()
322+
.ConfigureServices(services => services.AddSingleton(testService))
323+
.Configure(_ => { });
324+
})
325+
.StartAsync();
326+
327+
// Act
328+
// By calling GetTestServer(), a new TestServer instance will be instantiated
329+
var testServer = host.GetTestServer();
330+
331+
// Assert
332+
Assert.Equal(testService, testServer.Services.GetService<TestService>());
333+
}
334+
281335
public class TestService { public string Message { get; set; } }
282336

283337
public class TestRequestServiceMiddleware

0 commit comments

Comments
 (0)