Очистите мою базу данных после запуска всех тестов с использованием реальной базы данных
Я пишу некоторые тексты, используя это руководство: https://learn.microsoft.com/en-us/ef/core/testing/testing-with-the-database . Я бы предпочел использовать макеты, но после того, как я прочитал введение в тестирования я решил использовать реальную базу данных.
Я пишу свое собственное приспособление класса , как описано в параграфе Создание, заполнение и управление тестовой базой данных ... но я также должен добавитьdispose
способ восстановить предыдущее состояние базы данных. Вот мой код:
public class MyDbFixture : IDisposable
{
private static readonly object _lock = new();
private static bool _databaseInitialized;
public MyDbFixture()
{
lock (_lock)
{
if (!_databaseInitialized)
{
//Here I initialize my db
_databaseInitialized = true;
}
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public void Dispose(bool disposing)
{
lock (_lock)
{
if (_databaseInitialized)
{
if (disposing)
{
//Here i restore everything
}
_databaseInitialized = false;
}
}
}
}
Вот мой тестовый класс (где вы можете видеть, что у меня есть два теста):
public class MyTests : IClassFixture<MyDbFixture>
{
[Fact]
public void Test1()
{
}
[Fact]
public void Test2()
{
}
}
Что случилось:
- У меня есть два теста в моем тестовом классе, поэтому я дважды захожу в конструктор. Но база данных инициализируется только один раз. Это ожидаемое поведение!
- Тесты выполняются
- Я захожу внутрь своего метода два раза, а внутрь блока захожу только один раз. Никаких исключений. Это ожидаемое поведение! Но в базе ничего не меняется. Моя база данных не восстанавливается.
Если я удалюlock
изDispose
метод моегоMyDbFixture
, восстановление выполняется дважды. Никаких исключений. Все восстанавливается правильно. Но я думаю, что я не делаю хорошо. Почему мне нужно дважды запустить код, чтобы правильно восстановить базу данных?
Что я должен изменить, чтобы исправить поведение?
Надеюсь, все ясно. Пожалуйста, спросите меня, если вам нужна дополнительная информация.
Спасибо