Мне нужен доступ на создание экземпляров модели в методе
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. Прошу не предлагать использовать фикстуры как фукнции.