0

這裏是我的數據庫上下文類構建配置傳遞中的DbContext作爲參數,這樣我就可以在一個單元測試使用它

public class WorldContext : IdentityDbContext<WorldUser> 
    { 
    private IConfigurationRoot _config; 
    public WorldContext(IConfigurationRoot config, DbContextOptions options): base(options) 
    { 
     _config = config; 
    } 
    public DbSet<Trip> Trips { get; set; } 
    public DbSet<Stop> Stops { get; set; } 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     base.OnConfiguring(optionsBuilder); 
     optionsBuilder.UseSqlServer(_config["ConnectionStrings:WorldContextConnection"]); 
    } 
    } 

這裏是我的測試代碼,我想創建的部分我的dbcontext的一個實例。

  var builder = new ConfigurationBuilder(); 
      var config = builder.Build(); 
      var options = new DbContextOptionsBuilder<WorldContext>() 
       .UseInMemoryDatabase(Guid.NewGuid().ToString()) 
       .Options; 
      var context = new WorldContext(config, options); 

VS中沒有錯誤,並建立罰款,但測試失敗:

留言信息:System.ArgumentNullException:值不能爲空。 參數名稱:ConnectionString的

[有參照該堆疊中的跟蹤:]

在 TheWorld.DAL.Models.WorldContext.OnConfiguring(DbContextOptionsBuilder optionsBuilder)

+0

它表示連接字符串丟失。你確定你有連接字符串設置在配置文件中它需要? –

+0

@ChetanRanpariya我想這是通過配置參數傳遞的,這正是我努力構建的。雖然因爲我正在使用它進行測試,所以我在選項中使用了'.InMemoryDatabase',所以也許我不應該使用我的實際連接字符串,因爲我沒有試圖打到實際的數據庫......(? ) – egmfrs

回答

0

首先,在您的測試課程中創建DbContextOptions<WorldContext>的實例:

DbContextOptions<WorldContext> options; 
var builder = new DbContextOptionsBuilder<WorldContext>(); 
builder.UseInMemoryDatabase(Guid.NewGuid().ToString()); 
options = builder.Options; 

DbContextOptions實例將告訴WorldContext的所有配置,它將連接哪個數據庫等。由於它是內存數據庫,因此不需要發送連接字符串(恕我直言)。因此在WoldContext構造器中不需要IConfigurationRoot參數。


然後,創建WorldContext類的實例,並使用它:

var context = new WorldContext(options); 

或者你是說我不想改變我的構造函數,這是必要的,那麼:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
{ 
    base.OnConfiguring(optionsBuilder); 
    if(string.IsNullOrEmpty(_config["ConnectionStrings:WorldContextConnection"])) 
    { 
     optionsBuilder.UseInMemoryDatabase(Guid.NewGuid().ToString()); 
    } 
} 
+0

這適用於如果WorldContext接受的唯一參數是選項參數。我的情況我需要通過配置和選項。 請參閱我的代碼開始: '公共WorldContext(IConfigurationRoot配置,DbContextOptions選項)' – egmfrs

+0

- 我不能擺脫worldcontext類中的配置,否則我會打破我的項目的其餘部分。我正在從Pluralsight的Shaun Wildermuth處理一個示例項目。不幸的是,他沒有在項目中提供EF單元測試的例子。 – egmfrs

+0

我已經更新了答案。 – Orhun

相關問題