在Django 1.10至1.11更新后如何修复测试

时间:2019-03-05 10:20:05

标签: python django django-rest-framework django-1.11

我正在开发一个使用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的测试客户端extends Django's test client,所以我想该类的接口从1.10更改为1.11,并且正在做一些魔术,并返回这个新的HttpResponseBadRequest类的实例,该实例没有“数据”属性。但是,我没有在任何地方记录这些更改,也没有在网上找到任何讨论此问题的解决方案。是否有人知道需要更改什么以及在哪里可以找到有关新测试客户端界面的文档?

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

追踪

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 :(得分:0)

最后找到了罪魁祸首。来自Django 1.11 release notes

  运行测试时,不再禁用

ALLOWED_HOSTS 验证。如果   您的应用程序包含带有自定义主机名的测试,您必须   在ALLOWED_HOSTS中包括那些主机名。请参阅测试和多主机   名称。

我的ALLOWED_HOSTS中没有“ host.com”。我不知道为什么在测试期间会明确发送此消息,因为无论如何都没有检查设置。但这是一个遗留项目,其中包含许多可疑的代码,所以我不能说我真的很惊讶。

我还必须使用response.data更改项目中所有response.json()的出现。