Итак, у меня есть пара модульных тестов, которые читают или записывают в базу данных 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();
Проблема заключается в следующем:
- Когда я запускаю несколько тестов одновременно, база данных создается для каждого теста снова.Пока они выполняются, появляются асинхронные ошибки, потому что все запущенные тесты хотят создать одну и ту же базу данных одновременно.Кроме того, поскольку некоторые модульные тесты заполняют таблицы некоторыми тестовыми данными (где некоторые тесты совместно используют одни и те же данные, например, пользователи с одинаковым идентификатором), все портится.
Таким образом, я мог создать случайный уникальныйимя базы данных для каждого теста, но я сомневаюсь, что так оно и есть.
Кроме того, как выполнить очистку после завершения всех тестов?Я мог бы использовать метод удаления контекста для этого, если бы я выбрал опцию уникального имени базы данных.Но так ли это должно быть сделано?