Я обновил свой веб-сайт с помощью .Net Core 3.0 preview 2 и хочу сделать интеграционный тест с помощью TestServer.В .Net Core 2.2 я смог сделать это, используя WebApplicationFactory<Startup>
, поскольку WebHostBuilder
собирается быть устаревшим (см. (https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-2.2&tabs=visual-studio) для более подробной информации.), Я хочупродолжить и внедрить новый Generic HostBuilder
. Он отлично работает для запуска веб-сайта, но вылетает, когда я запускаю Интеграционные тесты . Я знаю, что WebApplicationFactory
использует WebHostBuilder
почему происходит сбой, но я не знаю, как изменить его для Generic HostBuilder
.
Вот мой код, который работал в .Net Core 2.2:
namespace CompX.FunctionalTest.Web.Factory
{
public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<Startup>
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureServices(services =>
{
// Create a new service provider.
var serviceProvider = new ServiceCollection()
.AddEntityFrameworkInMemoryDatabase()
.BuildServiceProvider();
// Add a database context (ApplicationDbContext) using an in-memory
// database for testing.
services.AddDbContext<ApplicationDbContext>(options =>
{
options.UseInMemoryDatabase("InMemoryDbForTesting");
options.UseInternalServiceProvider(serviceProvider);
});
services.AddDbContext<AppIdentityDbContext>(options =>
{
options.UseInMemoryDatabase("Identity");
options.UseInternalServiceProvider(serviceProvider);
});
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<AppIdentityDbContext>()
.AddDefaultTokenProviders();
// Build the service provider.
var sp = services.BuildServiceProvider();
// Create a scope to obtain a reference to the database
// context (ApplicationDbContext).
using (var scope = sp.CreateScope())
{
var scopedServices = scope.ServiceProvider;
var db = scopedServices.GetRequiredService<ApplicationDbContext>();
var loggerFactory = scopedServices.GetRequiredService<ILoggerFactory>();
var logger = scopedServices.GetRequiredService<ILogger<CustomWebApplicationFactory<TStartup>>>();
// Ensure the database is created.
db.Database.EnsureCreated();
try
{
// Seed the database with test data.
var userManager = scopedServices.GetRequiredService<UserManager<ApplicationUser>>();
AppIdentityDbContextSeed.SeedAsync(userManager).GetAwaiter().GetResult();
}
catch (Exception ex)
{
logger.LogError(ex, $"An error occurred seeding the database with test messages. Error: {ex.Message}");
}
}
});
}
}
}
Iпробовал с TestServers
из Microsoft.AspNetCore.TestHost
, но ему нужно new WebHostBuilder()
в качестве параметров.
Я также пытался передать это как параметры, но это также не сработало:
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
Не удается найти функцию .ConfigureWebHostDefaults()
.
Кто-нибудь успешно внедрил тестовый сервер в .Net Core 3.0? Большое спасибо!
PS: Я вроде как новичок в.Net Core
РЕДАКТИРОВАТЬ:
Это ошибка, которую я получаю от всех методов, которые пытаются сделать новый сервер:
Вот program.cs
namespace CompX.Web
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
Вот проблема, которую я создал на github: https://github.com/aspnet/AspNetCore/issues/7754