private void CreateHost() { var host = new HostBuilder() .ConfigureWebJobs((ctx, builder) => { builder.AddHttp(); var functionsHostBuilder = new TestFunctionsHostBuilder(builder.Services); var startup = new TStartup(); startup.Configure(functionsHostBuilder); }) .Build(); var jobHost = host.Services.GetService(typeof(IJobHost)) as JobHost; var mi = typeof(AlexaSkill).GetMethod("Run"); jobHost.CallAsync(mi, null); jobHost.CallAsync("Run", null).Wait(); host.StopAsync().Wait(); }
public TestWebApplicationFactory() { _webHostBuilder = new WebHostBuilder(); var functionsHostBuilder = new TestFunctionsHostBuilder(new ServiceCollection()); var startup = new TStartup(); startup.Configure(functionsHostBuilder); var loggerMock = new Mock <ILogger>(); _webHostBuilder.ConfigureServices(services => { services .AddMvcCore() .AddJsonFormatters(); services .AddTransient <TestFunctionsHostBuilder>() .AddTransient <AlexaSkill>() .AddSingleton(loggerMock.Object); foreach (var service in functionsHostBuilder.Services) { services.Add(service); } }); _webHostBuilder.Configure(app => { app.Run(async context => { //TODO: function discovery should be done once at start up var functions = DiscoverFunctions(); foreach (var function in functions) { if (!context.Request.Path.StartsWithSegments($"/api/{function.name}")) { continue; } var parameters = function.methodInfo.GetParameters(); var arguments = parameters.Select(parameter => { if (parameter.ParameterType == typeof(HttpRequest)) { return(context.Request); } var argument = context.RequestServices.GetService(parameter.ParameterType); if (argument == null) { throw new ArgumentException($"Could not resolve type {parameter.ParameterType} for method {function.methodInfo.DeclaringType}.{function.methodInfo.Name}"); } return(argument); }).ToArray(); var target = context.RequestServices.GetService(function.methodInfo.DeclaringType); var invocationTask = (Task <IActionResult>)function.methodInfo.Invoke(target, arguments); //TODO: assuming return type of Task<IActionResult> for now var result = await invocationTask; await context.ExecuteResultAsync(result); return; } throw new NotSupportedException(); }); }); }