我遵循这个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();
这是因为您正在使用:
上述内容将被以下行覆盖,如下所示: AddEntityFrameworkInMemoryDatabase()
AddEntityFrameworkInMemoryDatabase()
serviceProvider = services.BuildServiceProvider();
将上述内容替换为:
//Build the service provider. var sp = services.BuildServiceProvider();
然后使用 sp . 我希望这有帮助
sp