Я тестирую вид обновления с pytest . Следующий тест проходит нормально. Экземпляр lang_src
обновлен правильно.
class TestAvailableUpdateView:
url = "dashboard.staff:available-update"
def test_authenticated_staff(self, staff_client, lang_src):
url = reverse(self.url, kwargs={'pk': lang_src.pk})
data = {'code': 'it', 'pk': lang_src.pk}
resp = staff_client.post(url, data=data)
assert resp.status_code == 302
lang_src.refresh_from_db()
assert lang_src.code == 'it'
staff_client
определено в factories.py
:
from django.test import Client
@pytest.fixture()
def staff_user(db):
return User.objects.create_user(
username='staff@example.com',
password='password', is_staff=True,
is_active=True)
@pytest.fixture()
def staff_client(staff_user):
"""Return a Django test client logged in as a staff user."""
client = Client()
client.login(username=staff_user.username, password='password')
return client
Чтобы проверить messages
из contrib.messages
, я настроил folllow=True
следующим образом.
def test_updated_message(self, staff_client, lang_src):
url = reverse(self.url, kwargs={'pk': lang_src.pk})
data = {'code': 'it', 'pk': lang_src.pk}
resp = staff_client.post(url, data=data, follow=True)
assert resp.status_code == 200
message = list(resp.context.get('messages'))[0]
assert message == 'Languages updated'
Я вернулся TemplateResponse
, где resp.context['messages']
не содержит ни одного сообщения.
Вот вид:
class AvailableLanguageUpdateView(UpdateView):
model = AvailableLanguage
template_name = "dashboard_staff/languages/lang_form.html"
extra_context = {"available_lang_menu": True}
fields = ['code']
success_msg = _("Languages updated")
def form_valid(self, form):
messages.success(self.request, self.success_msg)
return super().form_valid(form)
И модель имеет get_absolute_url()
метод, который перенаправляет на просмотр списка, который работает нормально. И должен сказать, что обновление тоже работает нормально.
3-е РЕДАКТИРОВАНИЕ
Когда я запускаю тест, я получаю следующие исключения:
AssertionError: assert == 'Языки обновлены'
И если я проверю resp.url
, исключение:
AttributeError: объект 'TemplateResponse' не имеет атрибута 'url'
resp
:
<TemplateResponse status_code=200, "text/html; charset=utf-8">