在IntegrationTests中实例化DbContext

时间:2017-09-16 11:35:49

标签: c# entity-framework asp.net-core .net-core entity-framework-core

在Startup.cs中的WebApi(.NET Core 2.0 + EF Core)项目

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContextPool<MyContext>(options =>
        options.UseSqlServer(_config["ConnectionStrings:MyConnectionString"]));

    services.AddMvc();
}

背景:

public class MyContext : DbContext
{
    public MyContext(DbContextOptions<MyContext> options)
        : base(options)
    { }

    public MyContext()
    {
    }

    public DbSet<Employee> Employees { get; set; }
}

调用WebApi时没问题。

但在我的集成测试中,我想这样做:

[Fact]
void TestMethod()
{
    var context = new MyContext();

    var service = new MyService(context);

    var result = service.GetAll();//Error here

    Assert.True(result.Count() > 0);
}

我收到此错误:

  

没有为此DbContext配置数据库提供程序。一个   可以通过覆盖DbContext.OnConfiguring来配置提供程序   方法或在应用程序服务提供程序上使用AddDbContext

如何实例化上下文并指定要使用的连接字符串?

1 个答案:

答案 0 :(得分:6)

当您的默认构造函数绕过所有这些时,上下文仍然需要获取连接字符串和配置。

首先摆脱Db上下文中的默认构造函数

public class MyContext : DbContext {
    public MyContext(DbContextOptions<MyContext> options)
        : base(options)
    { }

    public DbSet<Employee> Employees { get; set; }
}

接下来更新测试以利用已提供的配置功能

[Fact]
void TestMethod() {
    //Arrange
    var optionsBuilder = new DbContextOptionsBuilder<MyContext>();
    optionsBuilder.UseSqlServer("connection string here");

    using (var context = new MyContext(optionsBuilder.Options)) {
        var service = new MyService(context);

        //Act
        var result = service.GetAll();//Error here

        //Assert
        Assert.True(result.Count() > 0);
    }
}

参考Configuring a DbContext: Configuring DbContextOptions