Использование AspNetCore.TestHost с EntityFrameworkCore.InMemory потеря данных

Я пытаюсь написать интеграционный тест для небольшого сервера GraphQL, который использую graphql-dotnet. Сервер работает нормально, когда я использую свое веб-приложение.

Чтобы запустить интеграционный тест, я пытаюсь использовать Microsoft.AspNetCore.TestHost для настройки сервера и отправки запроса POST. Я также пытаюсь использовать Microsoft.EntityFrameworkCore.InMemory для использования базы данных в памяти, а не "реальной" базы данных, работающей локально.

У меня есть файл TestStartUp.cs, который устанавливает базу данных в памяти и пытается сохранить одну запись:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.AddDbContext<MyDbContext>(options =>
        options.UseInMemoryDatabase()
    );

    ...
}

public void Configure(
        IApplicationBuilder app, 
        IHostingEnvironment env,
        MyDbContext myDbContext)
{
    myDbContext.Categories.Add(new Category {Id = 1, Name = "Category 1" });
    myDbContext.SaveChanges();
    app.UseMvc();
}

Я распечатал содержимое базы данных после вызова SaveChanges() и подтвердил, что объект сохраняется. Однако, когда мой объект репозитория пытается извлечь все Категории в введенном объекте MyDbContext, он показывает, что Категории не существуют.

Я пробовал различные конфигурации безрезультатно. Использование базы данных, которой нет в памяти, работает нормально, поэтому я уверен, что что-то мне не хватает. Это сводит меня с ума, поэтому любая помощь будет очень признательна!

1 ответ

Чтобы использовать InMemoryDatabase в нескольких местах, вам необходимо каждый раз предоставлять одни и те же параметры базы данных (использовать одну и ту же базу данных). Посмотрите ниже:

    protected DbContextOptions<BackofficeContext> GetDbContextOptions()
    {
        return new DbContextOptionsBuilder<BackofficeContext>().UseInMemoryDatabase(NAME_OF_YOUR_IN_MEMORY_DATABASE).Options;
    }

И тогда вы можете сделать что-то вроде этого:

var databaseOptions = GetDbContextOptions();

using (var context = new MyContext(databaseOptions))
{
    //Add some data to the database
    context.SaveChanges();
}

using (var context = new MyContext(databaseOptions))
{
    //Recieve data from the database
}
Другие вопросы по тегам