.Net Core Unit Test (xunit) - Обработка базы данных - PullRequest
0 голосов
/ 12 июня 2019

Итак, у меня есть пара модульных тестов, которые читают или записывают в базу данных MySql.Сначала я использовал new DbContextOptionsBuilder<Context>().UseInMemoryDatabase, чтобы создать базу данных в памяти.Это сработало отлично.

Однако мне потребовалось несколько MySQL Json-столбцов , и InMemoryDatabase не поддерживает их (например: public System.JsonObject<object> EventData { get; set; }).Поскольку они кажутся специфичными для MySQL.

Поэтому я подумал, что мне нужно протестировать реальную базу данных MySQL, но у меня возникли некоторые проблемы с этим.

Когда я создаю контекст, я создаюновая база данных в MySQL и подтолкнуть к ней миграцию.Это прекрасно работает:

//First create the schema
var options = new DbContextOptionsBuilder<MyContext>()
      .UseMySql(config["ConnectionStrings:MyConnectionString"])
      .Options;
_context = new MyContext(options);
_context.Database.ExecuteSqlCommand("CREATE SCHEMA `MySchema`");


//Use the database
options = new DbContextOptionsBuilder<MyContext>()
     .UseMySql(config["ConnectionStrings:MyConnectionString"] + ";database=MySchema")
     .Options;
_context = new MyContext(options);

//Add migrations
_context.Database.Migrate();

Проблема заключается в следующем:

  • Когда я запускаю несколько тестов одновременно, база данных создается для каждого теста снова.Пока они выполняются, появляются асинхронные ошибки, потому что все запущенные тесты хотят создать одну и ту же базу данных одновременно.Кроме того, поскольку некоторые модульные тесты заполняют таблицы некоторыми тестовыми данными (где некоторые тесты совместно используют одни и те же данные, например, пользователи с одинаковым идентификатором), все портится.

Таким образом, я мог создать случайный уникальныйимя базы данных для каждого теста, но я сомневаюсь, что так оно и есть.

Кроме того, как выполнить очистку после завершения всех тестов?Я мог бы использовать метод удаления контекста для этого, если бы я выбрал опцию уникального имени базы данных.Но так ли это должно быть сделано?

...