Как исправить тесты после обновления Django 1.10 до 1.11 - PullRequest
1 голос
/ 05 марта 2019

Я работаю над проектом, который использует Django 1.10 и DRF 3.6.4.Когда я обновляю Django до 1.11, многие тесты в классах, которые наследуются от DRF APITestCase, терпят неудачу со следующей ошибкой:

AttributeError: 'HttpResponseBadRequest' object has no attribute 'data'

В Django 1.10, однако, если я пытаюсь получить доступ к несуществующему атрибутув ответ я получаю:

AttributeError: 'Response' object has no attribute 'ariel'

тестовый клиент DRF расширяет тестовый клиент Django , поэтому я полагаю, что класс изменил свой интерфейс с 1.10 на 1.11 и выполняет некоторую магию и возвращает экземплярэтого нового HttpResponseBadRequest класса, который не имеет атрибута "data".Тем не менее, я не нашел, чтобы эти изменения были документированы нигде, и я не нашел ни одного обсуждения в Интернете, предлагающего решение для этого.Кто-нибудь знает, что нужно изменить и где я могу найти документацию для нового интерфейса клиента тестирования?

MCVE

views.py

from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status

class MyView(APIView):
    def post(self, request, *args, **kwargs):
        return Response({'error': 'My error message'}, status=status.HTTP_400_BAD_REQUEST)

urls.py

from django.conf.urls import url
from myapp import views

urlpatterns = [
    url(r'^path/to/view/$', views.MyView.as_view(), name="my_url")
]

test_views.py

from rest_framework import status
from rest_framework.reverse import reverse
from rest_framework.test import APITestCase

class TestMyView(APITestCase):
    def test_my_view(self):
        response = self.client.post(
            reverse('my_url'),
            data={'some': 'data'},
            format='json',
            HTTP_HOST='host.com'
        )
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(response.data['error'], "My error message")
        # The line above passes in Django 1.10 and fails in 1.11

Traceback

E
======================================================================
ERROR: test_my_view (myapp.tests.test_views.TestMyView)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/code/webapp/myapp/tests/test_views.py", line 14, in test_my_view
    response.data['error'],
AttributeError: 'HttpResponseBadRequest' object has no attribute 'data'

1 Ответ

0 голосов
/ 05 марта 2019

Наконец-то нашли виновника.Из примечаний к выпуску Django 1.11 :

ALLOWED_HOSTS больше не отключается при запуске тестов.Если ваше приложение включает тесты с пользовательскими именами хостов, вы должны включить эти имена хостов в ALLOWED_HOSTS.См. Тесты и несколько имен хостов.

У меня не было 'host.com' в моем ALLOWED_HOSTS.Я понятия не имею, почему это было явно отправлено во время тестов, так как в любом случае настройка даже не проверялась.Но это устаревший проект с большим количеством сомнительного кода, поэтому я не могу сказать, что я действительно удивлен.

Мне также пришлось изменить все вхождения response.data в проекте с помощью response.json().

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