Очистите мою базу данных после запуска всех тестов с использованием реальной базы данных

Я пишу некоторые тексты, используя это руководство: 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()
    {

    }
}

Что случилось:

  1. У меня есть два теста в моем тестовом классе, поэтому я дважды захожу в конструктор. Но база данных инициализируется только один раз. Это ожидаемое поведение!
  2. Тесты выполняются
  3. Я захожу внутрь своего метода два раза, а внутрь блока захожу только один раз. Никаких исключений. Это ожидаемое поведение! Но в базе ничего не меняется. Моя база данных не восстанавливается.

Если я удалюlockизDisposeметод моегоMyDbFixture, восстановление выполняется дважды. Никаких исключений. Все восстанавливается правильно. Но я думаю, что я не делаю хорошо. Почему мне нужно дважды запустить код, чтобы правильно восстановить базу данных?

Что я должен изменить, чтобы исправить поведение?

Надеюсь, все ясно. Пожалуйста, спросите меня, если вам нужна дополнительная информация.

Спасибо

0 ответов

Другие вопросы по тегам