gpt4 book ai didi

unit-testing - 替换 WebApplicationFactory 中的 DbContext 进行单元测试

转载 作者:行者123 更新时间:2023-12-05 06:00:03 26 4
gpt4 key购买 nike

我需要替换 WebApplicationFactory 中的上下文。我有 MyDbContext,我想用 SQLite 上下文替换它以进行测试。

替换部分工作正常

.ConfigureServices(services =>
{
// Remove the app's ApplicationDbContext registration.
var descriptor = services.SingleOrDefault(d => d.ServiceType == typeof(DbContextOptions<MyDbContext>));

if (descriptor != null)
{
services.Remove(descriptor);
}

services.AddDbContext<MyDbContext>(builder =>
{
builder.UseSqlite(CreateInMemoryDatabase());
});
});

但是因为我在测试中从 Npgsql 迁移到 SQLite,所以我需要覆盖 OnModelCreating 中的一些默认值。我创建了一个新的数据库上下文类

public class MySqlLiteDbContext: MyDbContext
{
public MySqlLiteDbContext(DbContextOptions<MyDbContext> options) : base(options)
{
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);

modelBuilder.Entity<Record>()
.Property(b => b.DateCreated)
.HasDefaultValueSql("(datetime('now'))");

...
}
}

有什么方法可以注入(inject) MySqlLiteDbContext 而不是 MyDbContext 以强制 EnsureCreated 使用 OnModelCreating 用于 SQLite?提取 IMyDbContext 是一个选项吗?我还能做些什么来解决这个问题?

最佳答案

好的,看来我是这样解决的

  1. 添加非通用 DBContext 构造函数覆盖,使其 protected
    public class MyDbContext: DbContext {        
public MyDbContext(DbContextOptions < MyDbContext > options): base(options) {}
// new
protected MyDbContext(DbContextOptions options): base(options) {}

// rest context stuff...
}
  1. ConfigureServices 上删除 WebApplicationFactory 中的 DBContext 和 DBContextOptions
.ConfigureServices(services => {
// Remove the app's ApplicationDbContext registration.
var descriptor = services.SingleOrDefault(d => d.ServiceType == typeof (DbContextOptions < MyDbContext > ));

if (descriptor != null) {
services.Remove(descriptor);
}

var descriptor2 = services.SingleOrDefault(d => d.ServiceType == typeof (MyDbContext));

if (descriptor2 != null) {
services.Remove(descriptor2);
}

//...
})
  1. 将您的后代上下文添加为实现
.ConfigureServices(services => {
// Remove the app's ApplicationDbContext registration.

// ...
services.AddDbContext < MyDbContext, MySqliteDbContext > (builder => {
builder.UseSqlite(CreateInMemoryDatabase());
}, ServiceLifetime.Singleton);
})

注意:如果您使用 InMemory Sqlite,请考虑 Singleton 作用域。

  1. 完成。现在,当 DocumentComparisonContext 注入(inject)时,DocumentComparisonSqlLiteContext 将用作实现,并在 EnsureCreated 上使用特定于 sqlite 的逻辑。

关于unit-testing - 替换 WebApplicationFactory 中的 DbContext 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67876503/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com