.Net Core Integration TestServer с универсальным IHostBuilder - PullRequest
0 голосов
/ 20 февраля 2019

Я обновил свой веб-сайт с помощью .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

РЕДАКТИРОВАТЬ:

Это ошибка, которую я получаю от всех методов, которые пытаются сделать новый сервер: enter image description here

Вот 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

1 Ответ

0 голосов
/ 23 февраля 2019

Я наконец понял, как это сделать в 3.0.Вот полное пошаговое руководство о том, как это сделать для всех, кому необходимо решение:

  1. Вам необходимо иметь по крайней мере .Net Core 3.0.0-preview2 , поскольку онидобавил WebApplicationFactory с IHostbuilder в этом предварительном просмотре (https://github.com/aspnet/AspNetCore/pull/6585). Вы можете найти его здесь: https://dotnet.microsoft.com/download/dotnet-core/3.0

  2. Обновите по крайней мере эти пакеты до версии 3.0.0 (https://github.com/aspnet/AspNetCore/issues/3756 и https://github.com/aspnet/AspNetCore/issues/3755):

    • Microsoft.AspNetCore.App Version=3.0.0-preview-19075-0444
    • Microsoft.AspNetCore.Mvc.Testing Version= 3.0.0-preview-19075-0444
    • Microsoft.Extensions.Hosting Version=3.0.0-preview.19074.2
  3. Удалить устаревшие пакеты, которые теперь включены в Microsoft.AspNetCore.App:

    • Microsoft.AspNetCore Version=2.2.0
    • Microsoft.AspNetCore.CookiePolicy Version=2.2.0
    • Microsoft.AspNetCore.HttpsPolicy Version=2.2.0
    • Microsoft.AspNetCore.Identity Version=2.2.0
  4. Если вы использовали services.AddIdentity в вашем WebApplicationFactory<Startup> компоновщике, вам нужно будет удалить его. В противном случае у вас будет новая ошибкаговоря, что вы уже используете эту схему для Identity.Application. Похоже, что новый WebApplicationFactory сейчас использует схему из Startup.cs.

Iбольше нечего изменить. Надеюсь, это будет полезно для некоторых людей!

Обновление:

Работало хорошо, пока мне не пришлось использовать другой файл Integration C # (например, LoginTest.cs и ManageTest.cs).Проблема заключалась в том, что когда я запускал свой тест, он бесконечно зацикливался, пока я не нажал CTRL + C. После этого он отобразил бы ошибку Access Denied .

Еще раз, мне пришлосьудалите что-то из моего WebApplicationFactory, семена:

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

Похоже, новый WebApplicationFactory пытался воссоздать usermanager для каждой фабрики.Я заменил свои засеянные учетные записи пользователей на Guid.NewGuid ().

Мне потребовалось время, чтобы понять это.Надеюсь, это может кому-то помочь, еще раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...