ASP.NET 核心集成测试
ASP.NET Core integration tests
我正在遵循此 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 services have not been added to the internal service
provider. Either remove the call to UseInternalServiceProvider so that
EF will manage its own internal services, or use the method from your
database provider to add the required services to the service provider
(e.g. AddEntityFrameworkSqlServer).
这没有意义,因为我相信我正在向这条线上的内部服务提供者添加 EF 服务:
var serviceProvider = new ServiceCollection()
.AddEntityFrameworkInMemoryDatabase()
.BuildServiceProvider();
那是因为您正在使用:
var serviceProvider = new ServiceCollection() .AddEntityFrameworkInMemoryDatabase() .BuildServiceProvider();
以上内容将被以下行覆盖,因为 AddEntityFrameworkInMemoryDatabase()
不是服务参数的一部分。
serviceProvider = services.BuildServiceProvider();
将上面的替换为:
//Build the service provider.
var sp = services.BuildServiceProvider();
然后使用 sp
创建作用域。希望对您有所帮助
我正在遵循此 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 services have not been added to the internal service provider. Either remove the call to UseInternalServiceProvider so that EF will manage its own internal services, or use the method from your database provider to add the required services to the service provider (e.g. AddEntityFrameworkSqlServer).
这没有意义,因为我相信我正在向这条线上的内部服务提供者添加 EF 服务:
var serviceProvider = new ServiceCollection()
.AddEntityFrameworkInMemoryDatabase()
.BuildServiceProvider();
那是因为您正在使用:
var serviceProvider = new ServiceCollection() .AddEntityFrameworkInMemoryDatabase() .BuildServiceProvider();
以上内容将被以下行覆盖,因为 AddEntityFrameworkInMemoryDatabase()
不是服务参数的一部分。
serviceProvider = services.BuildServiceProvider();
将上面的替换为:
//Build the service provider.
var sp = services.BuildServiceProvider();
然后使用 sp
创建作用域。希望对您有所帮助