@albertalexandrov

Pytest — Как получить доступ на запись в БД в методе setup_class?

Мне нужен доступ на создание экземпляров модели в методе setup_class. Код ниже не работает:

@pytest.mark.django_db
class TestPerson:

    @classmethod
    def setup_class(cls):
        self.person = Person.objects.create(first_name='John', last_name='Snow')  # here error happens

    def test_1(self):
        assert self.person.first_name == 'John'
    
    def test_2(self):
        assert self.person.last_name == 'Snow'


Падает с ошибкой:

RuntimeError: Database access not allowed, use the "django_db" mark, or the "db" or "transactional_db" fixtures to enable it.


Я нашел в исходном коде pytest места, где методы setup_class, setup_method становятся фикстурами. Создание экмемпляров модели в методе setup_method отрабатывает.

Но я не понимаю, почему это не работает в методе setup_class и как заставить это работать?

Также я попробовал вариант:

def make_setup_class_as_fixture(klass):
    old_setup_class = klass.setup_class

    @pytest.fixture(scope='class', autouse=True)
    def new_setup_class(cls):
        old_setup_class(cls)

    klass.setup_class = new_setup_class

    return klass


@make_setup_class_as_fixture
@pytest.mark.django_db
class TestPerson:

    def setup_class(cls):
        Person.objects.create(first_name='John', last_name='Snow')

    def setup_method(self):
        Person.objects.create(first_name='John', last_name='Snow')

    def test_1(self):
        assert True


Но он тоже не работает.

Еще я попробовал модифицировать декоратор так:

def make_setup_class_as_fixture(klass):
    old_setup_class = klass.setup_class

    @pytest.fixture(scope='class', autouse=True)
    def new_setup_class(cls, django_db_blocker):
        with django_db_blocker.unblock():
            old_setup_class(cls)

    klass.setup_class = new_setup_class

    return klass


Но так как self.person недоступен в тестовых методах, можно сделать вывод, что после того, как setup_class отработал, созданные данные стираются.

P.S. Прошу не предлагать использовать фикстуры как фукнции.
  • Вопрос задан
  • 158 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы