gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:12:00 25 4
gpt4 key购买 nike

我正在开发一个使用 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 ,所以我认为该类将其接口(interface)从 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

回溯

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'

最佳答案

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

ALLOWED_HOSTS validation is no longer disabled when running tests. If your application includes tests with custom host names, you must include those host names in ALLOWED_HOSTS. See Tests and multiple host names.

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

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

关于python - Django 1.10 到 1.11 更新后如何修复测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55000496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com