种子之后InMemoryDbContext不会持续存在,控制器中的集合始终为空

时间:2019-10-24 08:27:15

标签: c# .net testing .net-core

在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)。

1 个答案:

答案 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>();
}  

这样,每个测试将获得自己的上下文,但是在该测试期间,上下文将始终与同一数据库相关。