//uses the IWebHostBuilder, for apps using the legacy WebHost.CreateDefaultBuilder
        protected override void ConfigureWebHost(IWebHostBuilder builder)
        {
            builder.ConfigureAppConfiguration(config =>
            {
                config.AddUserSecrets <TStartup>(true, reloadOnChange: true);
            });

            builder.ConfigureServices(services =>
            {
                //set the test Authentication Scheme using the TestAuthorizationHandler class
                services.AddAuthentication("TestScheme")
                .AddScheme <AuthenticationSchemeOptions, TestAuthorizationHandler>("TestScheme", options => { });

                //remove DBContext registered in Startup, to set a new test one
                services.RemoveAll(typeof(ClientsManagerDbContext));

                //Register TestDbContext Middleware (In-Memory DB)
                services.AddDbContext <CMTestsDbContext>(options =>
                                                         options.UseInMemoryDatabase("ClientsManagerTestDB")
                                                         .EnableSensitiveDataLogging()
                                                         );

                //Register TestDbContext Middleware (SQL Server Test DB)
                //var testDBConnectionString = TestConfigurationHelper.getTestConnectionString();
                //services.AddDbContext<CMTestsDbContext>(options =>
                //    options.UseSqlServer(testDBConnectionString)
                //);

                //Add Generic Repo
                services.AddScoped(typeof(IGenericRepository <>), typeof(GenericRepository <>));

                //Build service provider
                var sp = services.BuildServiceProvider();

                //Get a reference to the DbContext and seed its DB with Test data
                using (var scope = sp.CreateScope())
                {
                    //Get the Test DbContext from the service collection
                    var scopedServices = scope.ServiceProvider;
                    var dbContext      = scopedServices.GetRequiredService <CMTestsDbContext>();

                    //Get the Logger service from the service collection
                    var logger = scopedServices.GetRequiredService <ILogger <TStartup> >();

                    try
                    {
                        //Seed DataBase for tests
                        TestSeeder.SeedDB(dbContext);
                    }
                    catch (Exception ex)
                    {
                        //log any seeding errors
                        logger.LogError(ex, "Error seeding the Test DB. Error: {Message}", ex.Message);
                    }
                }
            });
        }
예제 #2
0
        public TestHttpClient()
        {
            //create a WebApplicationfactory object
            _factory = new WebApplicationFactory <Startup>();

            //create and Configure an HttpClient
            _testClient = _factory
                          .WithWebHostBuilder(builder =>
            {
                builder.ConfigureServices(services =>
                {
                    //set the test Authentication Scheme using the TestAuthorizationHandler class
                    services.AddAuthentication("TestScheme")
                    .AddScheme <AuthenticationSchemeOptions, TestAuthorizationHandler>("TestScheme", options => { });

                    //remove DBContext registered in Startup, to set a new test one
                    services.RemoveAll(typeof(ClientsManagerDbContext));

                    //Add testing configured (InMemory) DbContext
                    services.AddDbContext <CMTestsDbContext>(options =>
                                                             options.UseInMemoryDatabase("TestDB")
                                                             .EnableSensitiveDataLogging()
                                                             );

                    //Add Generic Repo
                    //services.AddScoped(typeof(IGenericRepository<>), typeof(GenericRepository<>));

                    //Build service provider
                    var sp = services.BuildServiceProvider();

                    //Get a reference to the DbContext and seed its DB with Test data
                    using (var scope = sp.CreateScope())
                    {
                        //Get the Test DbContext from the service collection
                        var scopedServices = scope.ServiceProvider;
                        var context        = scopedServices.GetRequiredService <CMTestsDbContext>();

                        //Get the Logger service from the service collection
                        var logger = scopedServices.GetRequiredService <ILogger <Startup> >();

                        //ensure DB is deleted and newly created
                        context.Database.EnsureCreated();

                        try
                        {
                            //Seed db for tests
                            TestSeeder <T> .SeedDB(context);
                        }
                        catch (Exception ex)
                        {
                            //log any seeding errors
                            logger.LogError(ex, "Error seeding the Test DB. Error: {Message}", ex.Message);
                        }
                    }
                });
            })
                          .CreateClient();

            //set HttpClient.BaseAddress
            this.BaseAddress = _testClient.BaseAddress;

            //set the Test Authorization for the HttpClient
            //Test Authorization is defined in TestAuthorizationHandler.cs
            _testClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("TestScheme");
        }