Использование 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
}