Объект pytest-django не сохраняется в тестовой базе данных

Я использую pytest с pytest-django и pytest-bdd для тестирования простого приложения django. В файле настроек определена тестовая база данных sqlite3, которая создается при запуске тестов. Моя первая функция создает объект модели:

@given("A message exists")
def given_a_message_exists(transactional_db, message_text):
    message = message_models.Message(text=message_text)
    message.save()

Но хотя я могу открыть и просмотреть базу данных с помощью sql-браузера, модель никогда не сохраняется в базе данных. В следующей функции я могу получить сообщение из django ORM, но сообщение не сохраняется в базе данных, а вызов url-маршрута для удаления сообщения возвращает 404 с "Сообщение не найдено, соответствующее запросу".

@when("User visits the delete message page", target_fixture="page")
def user_visits_delete_message_page(transactional_db, browser, message_text):
    message = message_models.Message.objects.get(text=message_text)
    url = f"{browser.domain}/delete_message/{message.id}/{message.slug}/"
    browser.visit(url)
    return browser

Когда я запускаю сайт в обычном режиме, все работает, как ожидалось.

Вот фиксы из моего conftest.py...

MESSAGE_TEXT = "Ipsum Lorum Dolum Est"

CREATE_MESSAGE_URL = reverse("django_messages:message_create")
LIST_MESSAGE_URL = reverse("django_messages:message_list")

LINKS_DICT = {
    "create_message": f"a[href='{CREATE_MESSAGE_URL}']",
    "list_message": f"a[href='{LIST_MESSAGE_URL}']",
}

PAGES_DICT = {
    "create_message": CREATE_MESSAGE_URL,
    "list_message": LIST_MESSAGE_URL,
}


@pytest.fixture()
def message_text():
    return MESSAGE_TEXT


@pytest.fixture()
def browser(sb, live_server, settings):
    staging_server = os.environ.get("STAGING_SERVER")
    if staging_server:
        sb.visit(staging_server)
    else:
        sb.visit(live_server)
    sb.domain = sb.get_domain_url(sb.get_current_url())
    settings.EMAIL_PAGE_DOMAIN = sb.domain
    sb.pages = PAGES_DICT
    sb.links = LINKS_DICT
    return sb

Почему модель не сохраняется в базе данных, когда я вызываю message.save()?

Оказалось, что использование фикстуры браузера вызывает проблему, которую я пока не до конца понимаю. Если я передаю браузер в шаг, а затем возвращаю его в качестве target_fixture для последующих функций, то все работает как ожидалось.

Вернуться на верх