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

问题描述 投票:1回答:1

我正在开发一个使用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类的实例,该类没有“data”属性。但是,我没有发现这些变化记录在任何地方,我没有找到任何在线讨论为此提出解决方案。有没有人知道需要更改什么以及在哪里可以找到新测试客户端界面的文档?

MCVE

views.朋友

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.朋友

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.朋友

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'
python django django-rest-framework django-1.11
1个回答
0
投票

终于找到了罪魁祸首。来自Django 1.11 release notes

运行测试时不再禁用ALLOWED_HOSTS验证。如果您的应用程序包含具有自定义主机名的测试,则必须在ALLOWED_HOSTS中包含这些主机名。请参阅测试和多个主机名。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.