Пользовательский WebApplicationFactory в интеграционном тестировании без регистрации служб в Startup.cs (ASP. NET Core 3.1) - PullRequest
0 голосов
/ 13 апреля 2020

Я столкнулся с проблемой, когда я использую пользовательский WebApplicationFactory , и он не регистрирует службы в моем файле Startup.cs. Я использую Asp. Net core 3.1 и Xunit.

У меня ниже в моем API (startup.cs) зарегистрировано с использованием методов расширения:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddBaseApiConfiguration(Configuration);

            services.AddRepositoryServices();

            services.AddApiServices();

            services.AddMediatrServices();
        }

Для документации MS:

Зарегистрирован контекст базы данных SUT в его метод Startup.ConfigureServices. Обратный вызов builder.ConfigureServices тестового приложения выполняется после выполнения кода приложения Startup.ConfigureServices.

Но выше не происходит. Ни одна из моих служб из запуска, которую я использую, не регистрируется ( т.е. 4 метода расширения, которые у меня есть, никогда не вызываются и никогда не регистрируются) . Это вызывает несколько проблем: мой контекст БД использует IMediatr в своем конструкторе, так что события могут публиковаться во время context.SaveChangesAsyn c () (в случае успеха). Но так как мой сервис никогда не регистрируется, он не может его найти. Как мне убедиться, что это происходит правильно?

Ниже моя фабрика:

    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder
        .UseEnvironment("Development")
        .ConfigureServices(services =>
        {
            // Remove the app's db context registrations
            var descriptor = services.SingleOrDefault(
                d => d.ServiceType ==
                    typeof(DbContextOptions<AppDbContext>));


            if (descriptor != null)
            {
                services.Remove(descriptor );
            }

            services.AddSingleton<IDbConnectionFactoryService, SqliteConnectionFactoryService>();

            // Add a database context using an in-memory 
            // database for testing.
            services.AddDbContext<AppDbContext>(options =>
            {
                options.UseSqlite("Data Source=sqlitedemo.db");
            });

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

            // Create a scope to obtain a reference to the database context 
            using (var scope = sp.CreateScope())
            {
                var scopedServices = scope.ServiceProvider;
                var db = scopedServices.GetRequiredService<AppDbContext>();

                // Ensure the database is created.
                db .Database.EnsureDeleted();
                db .Database.EnsureCreated();
            }
        });
    }

Редактировать: Кажется, что службы в Startup.cs вызываются после службы фабрики CustomWebApplication. Это совершенно странно для Net core 3.0, порядок был изменен на противоположный. Так почему же это все еще происходит?

Редактировать 2 : необходимо использовать ConfigureTestServices вместо ConfigureServices.

1 Ответ

0 голосов
/ 13 апреля 2020

Я не нашел этого в документации, но вызов ConfigureTestServices гарантирует, что сервисы CustomWebApplicationFactory будут вызываться после вызова сервисов запуска. Согласно документации, это не указано правильно, но, по крайней мере, это может помочь кому-то, кто столкнулся с той же проблемой.

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