在TestStartup内部,我正在重写ConfigureDatabase方法,以便可以使用InMemory进行测试。
public class TestStartup : Startup
{
public override void ConfigureDb(IServiceCollection services)
{
services.AddDbContext<CarContext>(options => options.UseInMemoryDatabase(Guid.NewGuid().ToString()));
services.AddTransient<DbSeeder>();
}
public override void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
base.Configure(app, env);
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
var dbSeeder = serviceScope.ServiceProvider.GetService<DbSeed>();
dbSeeder.Seed();
}
}
}
public class DbSeed
{
private readonly CarContext _context;
public DbSeed(ContactContext context)
{
_context = context;
}
public void Seed()
{
_context.Cars.AddRange(DataGenerator.Cars);
_context.SaveChanges();
}
}
内部DbSeed类_context.SaveChanges
保存数据(在调试中返回> 0)
但是在Controller ICarService
(使用CarContext
)中有Car DbSet的空集合(使用了InMemoryDbContext)。
答案 0 :(得分:1)
问题在于,通过始终为上下文赋予新名称(Guid.NewGuid().ToString()
),您永远不会两次获得相同的数据库。对于一项测试,您应确保始终使用具有相同名称的上下文。
这可以完成。 G。通过以下方式:
public override void ConfigureDb(IServiceCollection services)
{
var dbName = Guid.NewGuid().ToString();
services.AddDbContext<CarContext>(options => options.UseInMemoryDatabase(dbName));
services.AddTransient<DbSeeder>();
}
这样,每个测试将获得自己的上下文,但是在该测试期间,上下文将始终与同一数据库相关。