@@ -37,9 +37,11 @@ public class TestFunctionHost : IDisposable
37
37
private readonly WebJobsScriptHostService _hostService ;
38
38
39
39
public TestFunctionHost ( string scriptPath , string logPath ,
40
- Action < IWebJobsBuilder > configureJobHost = null ,
41
- Action < IConfigurationBuilder > configureAppConfiguration = null ,
42
- Action < IServiceCollection > configureServices = null )
40
+ Action < IServiceCollection > configureWebHostServices = null ,
41
+ Action < IWebJobsBuilder > configureScriptHostWebJobsBuilder = null ,
42
+ Action < IConfigurationBuilder > configureScriptHostAppConfiguration = null ,
43
+ Action < ILoggingBuilder > configureScriptHostLogging = null ,
44
+ Action < IServiceCollection > configureScriptHostServices = null )
43
45
{
44
46
_appRoot = scriptPath ;
45
47
@@ -65,32 +67,37 @@ public TestFunctionHost(string scriptPath, string logPath,
65
67
services . Replace ( new ServiceDescriptor ( typeof ( IOptions < ScriptApplicationHostOptions > ) , new OptionsWrapper < ScriptApplicationHostOptions > ( _hostOptions ) ) ) ;
66
68
services . Replace ( new ServiceDescriptor ( typeof ( IOptionsMonitor < ScriptApplicationHostOptions > ) , optionsMonitor ) ) ;
67
69
68
- services . AddSingleton < IConfigureBuilder < IConfigurationBuilder > > ( _ => new DelegatedConfigureBuilder < IConfigurationBuilder > ( c =>
69
- {
70
- c . AddTestSettings ( ) ;
71
- configureAppConfiguration ? . Invoke ( c ) ;
72
- } ) ) ;
73
-
74
- configureServices ? . Invoke ( services ) ;
75
- } )
76
- . AddScriptHostBuilder ( webJobsBuilder =>
77
- {
78
- webJobsBuilder . Services . AddLogging ( loggingBuilder =>
79
- {
80
- loggingBuilder . AddProvider ( _scriptHostLoggerProvider ) ;
81
- loggingBuilder . AddFilter < TestLoggerProvider > ( _ => true ) ;
82
- } ) ;
83
-
84
- webJobsBuilder . AddAzureStorage ( ) ;
85
-
86
- configureJobHost ? . Invoke ( webJobsBuilder ) ;
70
+ // Allows us to configure services as the last step, thereby overriding anything
71
+ services . AddSingleton ( new PostConfigureServices ( configureWebHostServices ) ) ;
87
72
} )
88
- . UseStartup < Startup > ( ) ;
73
+ . ConfigureScriptHostWebJobsBuilder ( scriptHostWebJobsBuilder =>
74
+ {
75
+ scriptHostWebJobsBuilder . AddAzureStorage ( ) ;
76
+ configureScriptHostWebJobsBuilder ? . Invoke ( scriptHostWebJobsBuilder ) ;
77
+ } )
78
+ . ConfigureScriptHostAppConfiguration ( scriptHostConfigurationBuilder =>
79
+ {
80
+ scriptHostConfigurationBuilder . AddTestSettings ( ) ;
81
+ configureScriptHostAppConfiguration ? . Invoke ( scriptHostConfigurationBuilder ) ;
82
+ } )
83
+ . ConfigureScriptHostLogging ( scriptHostLoggingBuilder =>
84
+ {
85
+ scriptHostLoggingBuilder . AddProvider ( _scriptHostLoggerProvider ) ;
86
+ scriptHostLoggingBuilder . AddFilter < TestLoggerProvider > ( _ => true ) ;
87
+ configureScriptHostLogging ? . Invoke ( scriptHostLoggingBuilder ) ;
88
+ } )
89
+ . ConfigureScriptHostServices ( scriptHostServices =>
90
+ {
91
+ configureScriptHostServices ? . Invoke ( scriptHostServices ) ;
92
+ } )
93
+ . UseStartup < TestStartup > ( ) ;
89
94
90
95
_testServer = new TestServer ( builder ) ;
91
96
92
- HttpClient = new HttpClient ( new UpdateContentLengthHandler ( _testServer . CreateHandler ( ) ) ) ;
93
- HttpClient . BaseAddress = new Uri ( "https://localhost/" ) ;
97
+ HttpClient = new HttpClient ( new UpdateContentLengthHandler ( _testServer . CreateHandler ( ) ) )
98
+ {
99
+ BaseAddress = new Uri ( "https://localhost/" )
100
+ } ;
94
101
95
102
var manager = _testServer . Host . Services . GetService < IScriptHostManager > ( ) ;
96
103
_hostService = manager as WebJobsScriptHostService ;
@@ -254,5 +261,43 @@ protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage reques
254
261
return base . SendAsync ( request , cancellationToken ) ;
255
262
}
256
263
}
264
+
265
+ private class TestStartup
266
+ {
267
+ private Startup _startup ;
268
+ private readonly PostConfigureServices _postConfigure ;
269
+
270
+ public TestStartup ( IConfiguration configuration , PostConfigureServices postConfigure )
271
+ {
272
+ _startup = new Startup ( configuration ) ;
273
+ _postConfigure = postConfigure ;
274
+ }
275
+
276
+ public void ConfigureServices ( IServiceCollection services )
277
+ {
278
+ _startup . ConfigureServices ( services ) ;
279
+ _postConfigure ? . ConfigureServices ( services ) ;
280
+ }
281
+
282
+ public void Configure ( AspNetCore . Builder . IApplicationBuilder app , AspNetCore . Hosting . IApplicationLifetime applicationLifetime , AspNetCore . Hosting . IHostingEnvironment env , ILoggerFactory loggerFactory )
283
+ {
284
+ _startup . Configure ( app , applicationLifetime , env , loggerFactory ) ;
285
+ }
286
+ }
287
+
288
+ private class PostConfigureServices
289
+ {
290
+ private readonly Action < IServiceCollection > _postConfigure ;
291
+
292
+ public PostConfigureServices ( Action < IServiceCollection > postConfigure )
293
+ {
294
+ _postConfigure = postConfigure ;
295
+ }
296
+
297
+ public void ConfigureServices ( IServiceCollection services )
298
+ {
299
+ _postConfigure ? . Invoke ( services ) ;
300
+ }
301
+ }
257
302
}
258
303
}
0 commit comments