Я пытаюсь понять, как работает исправление, и я тестирую с pytest a Django View:
views.py
from django.contrib.auth.views import LoginView
class MyLoginView(LoginView):
pass
test_view.py
from django.test import RequestFactory
from .views import MyLoginView
rf = RequestFactory()
def test_login(rf):
request = rf.get(reverse('myapp:login'))
response = MyLoginView.as_view()(request)
assert response.status_code == 200
Это не удается, потому что это представление вызывает базу данных для получения текущего сайта, используя функцию get_current_site()
:
Failed: Database access not allowed
Как я могу издеваться get_current_site()
чтобы избежать попадания в базу данных?
Идея состоит в том, чтобы использовать фабрику с pytest-factoryboy.
Мне удалось высмеять LoginView.get_context_data
, но я не могу идти глубже:
from django.test import RequestFactory
from .views import MyLoginView
from django.contrib.sites.models import Site
from pytest_factoryboy import register
from unittest.mock import patch
rf = RequestFactory()
class SiteFactory(factory.Factory):
class Meta:
model = Site
register(SiteFactory)
def test_login_social(rf, site_factory):
request = rf.get(reverse('myapp:login'))
with patch(
# 'django.contrib.auth.views.LoginView.get_context_data', # This is wrong
'django.contrib.auth.views.get_current_site', # Solution: Patch where it is imported, this works!
return_value=site_factory(name='example.com'),
):
response = CommunityLoginView.as_view()(request)
assert response.status_code == 200
Редактировать
Решение заключается в исправлении вызываемого метода в области, в которой он импортируется :
with patch('django.contrib.auth.views.get_current_site')
Здесь возникает ошибка из-за того, что context_data
является <class 'django.contrib.sites.models.Site'>
Как бы вы это сделали?