gpt4 book ai didi

c# - 在由 UseInMemoryDatabase() 创建的 IdentityDbContext 中使用身份管理器

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

我制作此方法是为了使单元测试 DbContext 更容易。此方法在内存中生成我的 dbContext。它之所以有效,是因为我使用实体对其进行了测试(如 _context.Projects_context.Tests 等,在单元测试中,此方法有效):

        public static TaskManagerDbContext Create()
{
var options = new DbContextOptionsBuilder<TaskManagerDbContext>()
.UseInMemoryDatabase(Guid.NewGuid().ToString())
.EnableSensitiveDataLogging(true)
.Options;

var context = new TaskManagerDbContext(options);
context.SaveChanges();

return context;
}

我的 DbContextClass 看起来像这样:


public class TaskManagerDbContext : IdentityDbContext<ApplicationUser>, ITaskManagerDbContext
{
public TaskManagerDbContext(DbContextOptions<TaskManagerDbContext> options)
: base(options)
{
}

//db sets here

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfigurationsFromAssembly(typeof(TaskManagerDbContext).Assembly);
}
}

我的问题是,我们可以在内存中创建 Identity 的 UserManagerSignInManagerRoleManager,就像我们可以使用 IdentityDbContext?如何单元测试 Identity 之类的东西,比如用户,内存中的角色,就像我们可以用标准的 Context 做的那样?如何在我测试它时在存储在内存中的假上下文中调用此 Managers

编辑:

基于 this SO Question身份共享显而易见的 context。但是如何在 UseInMemoryDatabase() 方法创建的 IdentityDbContext 上使用 Managers 呢?

编辑 2:

我正在通过 fixture 注入(inject) context:

public class DatabaseFixture
{
public TaskManagerDbContext Context { get; private set; }

public DatabaseFixture()
{
this.Context = DatabaseContextFactory.Create();
}
}

[CollectionDefinition("DatabaseTestCollection")]
public class QueryCollection : ICollectionFixture<DatabaseFixture>
{
}

及其用法:

[Collection("DatabaseTestCollection")]
public class RegisterUserCommandTests
{
private readonly TaskManagerDbContext _context;

public RegisterUserCommandTests(DatabaseFixture fixture)
{
_context = fixture.Create();
}

//and usage of it in class:
var user = _context.Projects.Find(8);
}

我正在使用 Xunit

最佳答案

您需要创建一个服务集合,向其中注册所有内容,然后使用它来提取您需要的内容。

var services = new ServiceCollection();
services.AddDbContext<TaskManagerDbContext>(o =>
o.UseInMemoryDatabase(Guid.NewGuid()));
services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<TaskManagerDbContext>();
var provider = services.BuildServiceProvider();

然后,你可以使用provider:

using (var scope = provider.CreateScope())
{
var userManager = scope.ServiceProvider.GetRequiredService<UserManager<IdentityUser>>();
}

关于c# - 在由 UseInMemoryDatabase() 创建的 IdentityDbContext 中使用身份管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56929729/

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