如何正确设置xUnit测试项目中的DbContext?

20
我有如下代码来设置 .Net Core 2.0 控制台程序中的 DBContext,并将其注入到主应用程序类的构造函数中。
    IConfigurationRoot configuration = GetConfiguration();
    services.AddSingleton(configuration);
    Conn = configuration.GetConnectionString("ConnStr1");

    services.AddDbContext<MyDbContext>(o => o.UseSqlServer(Conn));

现在我创建了一个xUnit测试类,并需要为测试初始化相同的DbContext。

    context = new MyDbContext(new DbContextOptions<MyDbContext>());

出现了参数错误,connectionString不能为空。如何在测试项目中正确设置DbContext?


6
您只需要为它设置选项。例如,这些选项用于将数据库存储在内存中: var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>(); optionsBuilder.UseInMemoryDatabase(); var context = new MyDbContext(optionsBuilder.Options); - George Alexandria
3个回答

14

我找到了一种方法来做到它。

var dbOption = new DbContextOptionsBuilder<MyDbContext>()
    .UseSqlServer("....")
    .Options;

对于其他人,其他解决方案更完整一些,因为它们也初始化了上下文! - Sam

9

George Alexandria的解决方案对我有用:

var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>();
optionsBuilder.UseInMemoryDatabase(); 
var context = new MyDbContext(optionsBuilder.Options);

UseInMemoryDatabase 扩展方法包含在 Microsoft.EntityFrameworkCore.InMemory 中。


1
对于那些使用这种更完整的方法的人,请不要忘记使用'context.dispose()'或者一个using括号,例如:using (var context = new MyDbContext(optionsBuilder.Options)){ // 在这里编写你的代码}。 - Kelby Criswell
你是否使用流畅的API进行配置?由于它是由ASP.Net提供DI,因此似乎ModelBuilder在OnModelCreating(ModelBuilder modelBuilder)中不可用。是否有一种方法可以为测试项目提供DBContext的ModelBuilder? - DavidY

3

EF 2.0 要求所有内存数据库都有名称,因此请确保按以下方式进行命名:

var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>();
optionsBuilder.UseInMemoryDatabase("MyInMemoryDatabseName"); 
var context = new MyDbContext(optionsBuilder.Options);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接