Использование менеджеров Identity в IdentityDbContext, который был создан UseInMemoryDatabase () - PullRequest
0 голосов
/ 08 июля 2019

Я сделал этот метод, чтобы упростить юнит-тестирование DbContext.Этот метод делает Context из моих db в памяти.Это работает, потому что я тестирую его с сущностями (такими как _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;
        }

My 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 UserManager, SignInManager, RoleManager в памяти, как мы можем сделать с IdentityDbContext?Как провести модульное тестирование Identity таких вещей, как пользователи, роли в памяти, как мы можем сделать со стандартным Context?Как назвать это Managers в поддельном контексте, который хранится в памяти во время его тестирования?

РЕДАКТИРОВАТЬ:

На основе этот SO Вопрос Удостоверение личности context, что очевидно.Но как использовать Managers для созданного IdentityDbContext методом UseInMemoryDatabase()?

EDIT2:

Я делаю инъекцию 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.

1 Ответ

1 голос
/ 08 июля 2019

Вам нужно создать коллекцию сервисов, зарегистрировать все с этим и затем использовать это, чтобы вытащить то, что вам нужно.

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>>();
}
...