Тестирование contrib.messages из UpdateView с pytest - PullRequest
0 голосов
/ 26 апреля 2019

Я тестирую вид обновления с 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">

1 Ответ

0 голосов
/ 26 апреля 2019

Я думаю, что решение стоит упомянуть, потому что многие решения, использующие response.context.get('messages'), не работают.

Я обнаружил, что messages хранится в wsgi_request. Итак, для проверки вашего success_message вы можете сделать что-то вроде:


class TestAvailableUpdateView:
    url = "dashboard.staff:available-update"

    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
        messages = [m.message for m in get_messages(resp.wsgi_request)]
        assert 'Languages updated' in messages

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...