Интеграционные тесты ASP.NET Core - PullRequest
1 голос
/ 20 мая 2019

Я следую схеме из этого документа MS:

https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-2.2

public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<Startup>
{
    protected override IWebHostBuilder CreateWebHostBuilder()
    {
        return WebHost.CreateDefaultBuilder()
            .UseStartup<Startup>();
    }

    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.ConfigureServices(services =>
        {
            var serviceProvider = new ServiceCollection()
                .AddEntityFrameworkInMemoryDatabase()
                .BuildServiceProvider();

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

            serviceProvider = services.BuildServiceProvider();

            using (var scope = serviceProvider.CreateScope())
            {
                var scopedProvider = scope.ServiceProvider;
                var myDb = scopedProvider.GetRequiredService<MyDbContext>();
                var logger = scopedProvider.GetRequiredService<ILogger<CustomWebApplicationFactory<TStartup>>>();

                myDb.Database.EnsureCreated();
            }
        });

        builder.UseContentRoot(".");
        base.ConfigureWebHost(builder);
    }
}

, но в этой строке

var myDb = scopedProvider.GetRequiredService<MyDbContext>();

Я получаю ошибку

Службы Entity Framework не были добавлены к внутреннему поставщику услуг.Удалите вызов UseInternalServiceProvider, чтобы EF управлял своими собственными внутренними службами, или используйте метод из вашего поставщика базы данных, чтобы добавить необходимые службы поставщику услуг (например, AddEntityFrameworkSqlServer).

Это не делаетсмысл быть, потому что я полагаю, что я добавляю услуги EF к внутреннему поставщику услуг в этой строке:

var serviceProvider = new ServiceCollection()
    .AddEntityFrameworkInMemoryDatabase()
    .BuildServiceProvider();

1 Ответ

2 голосов
/ 20 мая 2019

Это потому, что вы используете:

var serviceProvider = new ServiceCollection() .AddEntityFrameworkInMemoryDatabase() .BuildServiceProvider();

Вышеуказанное будет переопределено следующей строкой, так как AddEntityFrameworkInMemoryDatabase() не является частью параметра services.

serviceProvider = services.BuildServiceProvider();

Заменитевыше с:

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

Затем создайте область, используя sp.Я надеюсь, что это помогает

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