代码之家  ›  专栏  ›  技术社区  ›  BaltoStar

ASP。NET核心集成测试

  •  0
  • BaltoStar  · 技术社区  · 7 年前

    我遵循这个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>();
    

    实体框架服务尚未添加到内部服务 EF将管理自己的内部服务,或使用您的 (例如AddEntityFrameworkSqlServer)。

    这毫无意义,因为我认为我正在向这条线上的内部服务提供商添加EF服务:

    var serviceProvider = new ServiceCollection()
        .AddEntityFrameworkInMemoryDatabase()
        .BuildServiceProvider();
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Shahzad Hassan    7 年前

    这是因为您正在使用:

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

    上述内容将被以下行覆盖,如下所示: AddEntityFrameworkInMemoryDatabase()

    serviceProvider = services.BuildServiceProvider();
    

    将上述内容替换为:

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

    然后使用 sp . 我希望这有帮助

    推荐文章