//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); } } }); }
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"); }