Как обеспечить создание базы данных Entity Framework Core InMemory для каждого метода тестирования? - PullRequest
0 голосов
/ 30 апреля 2019

Dears, Я пытаюсь создать интеграционные тесты, которые тестируют мой контроллер API с использованием провайдера базы данных ядра структуры сущностей. Я создал CustomWebApplicationFactory , который настраивает мои службы, включая мой контекст БД, согласно официальному руководству по документации и я использовал эту фабрику как IClassFixture в моих тестовых классах xunit, но мои тесты были сломаны, когда они выполнялись в параллельном , потому что, как я думаю, они использовали один и тот же экземпляр базы данных . Это моя конфигурация

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

            // 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>();


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


            }
        });
    }
}

1 Ответ

1 голос
/ 30 апреля 2019

я думаю, что они использовали один и тот же экземпляр базы данных

Вы правы, IClassFixture является экземпляром общего объекта в нескольких тестах.

Для повторного использования ConfigureWebHost вы можете использовать конструктор тестового класса. Таким образом, все ваши тесты будут запускать конфигурацию, но не будут делиться экземплярами объекта. Вам также может понадобиться изменить options.UseInMemoryDatabase("InMemoryDbForTesting");, чтобы использовать случайное имя в памяти (например, options.UseInMemoryDatabase(Guid.NewGuid().ToString());.

).

Официальные документы xunit также могут помочь: https://xunit.net/docs/shared-context

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