Объект 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 для последующих функций, то все работает как ожидалось.