Exemple #1
0
        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();
        }
Exemple #2
0
        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();
                });
            });
        }