3

在的WebAPI(.NET核2.0 + EF核心)項目Startup.cs實例化的DbContext在IntegrationTests

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配置

我怎樣才能實例化的背景下,並指定ConnectionString,以使用?

回答

4

上下文仍然需要獲取連接字符串和配置,而默認構造函數會繞過所有這些。

首先在你的數據庫方面

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

相關問題