Переопределить EF Core DbContext в ASP.NET Core WebApplicationFactory - PullRequest
1 голос
/ 14 октября 2019

У меня есть проект ASP.NET Core 2.2 WebApi, в котором также используется EF Core 2.2. Проект протестирован с помощью интеграционных тестов с WebApplicationFactory<T>.

. Я попытался перенести проект web api в netcore / aspnetcore 3, который сработал очень хорошо. Я наткнулся на миграцию тестов.

У меня есть следующий код, который работал в aspnetcore 2.2:

    public class MyServiceWebHostFactory : WebApplicationFactory<Service.Startup>
    {
        protected override void ConfigureWebHost(IWebHostBuilder builder)
        {   
            builder.ConfigureServices(services =>
            {
                var serviceProvider = new ServiceCollection()
                                   .AddEntityFrameworkInMemoryDatabase()
                                   .BuildServiceProvider();

                services.AddDbContext<MyContext>((options, context) =>
                {
                    context.UseInMemoryDatabase("MyDb")
                           .UseInternalServiceProvider(serviceProvider);
                });

                var sp = services.BuildServiceProvider();

                using var scope = sp.CreateScope();

                var scopedServices = scope.ServiceProvider;

                // try to receive context with inmemory provider:
                var db = scopedServices.GetRequiredService<MyContext>();

                // more code...

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

                // more code...
            });
        }
    }

Он заменяет EF Core DbContext на DbContext, используя InMemoryProvider.

После перехода на 3.0 он больше не заменяется. Я всегда получаю DBContext с настроенным SQL Server.

Если я удаляю вызов services.AddDbContext<MyContext>(options => options.UseSqlServer(connectionString)) в ConfigureServices приложения (Service.Startup), это работает, но это не решение.

Я также попробовал services.RemoveAll(typeof(MyContext)) перед регистрацией контекста памяти, который тоже не работает.

1 Ответ

0 голосов
/ 30 октября 2019

Убедитесь, что есть конструктор, который принимает параметры DbContextOptions в качестве аргумента, и OnConfigure не имеет переопределения:

MyContext.cs

MyContext(DbContextOptions<MyContext> options)
 :base(options)
{}

TestStartup.cs

services.AddDbContext<MyContext>(
        optionsBuilder => {
            optionsBuilder.UseInMemoryDatabase("MyDb");
            });
...