django test RequestFactory 无法让路由参数工作

Posted

技术标签:

【中文标题】django test RequestFactory 无法让路由参数工作【英文标题】:django test RequestFactory cannot get route parameter to work 【发布时间】:2016-12-25 09:33:26 【问题描述】:

我有一个问题,我不知道如何使它工作。

urls.py:

urlpatterns = [
    url(r'athletes/search$', SearchAthletes.as_view()),
    url(r'athletes/([0-9]+)$', ViewAthlete.as_view())
]

views.py:

class ViewAthlete(APIView):

    def get(self, request, id, format=None):
        athlete = Athlete.objects.get(id=id)
        serializer = AthleteSerializer(athlete)
        return Response(serializer.data)

test.py:

def test_view_athlete(self):
    tmp = Athlete.objects.order_by('?')[0]

    request = self.factory.get('/_api/v1/athletes/' + str(tmp.id))
    request.user = AnonymousUser()

    response = ViewAthlete.as_view()(request)
    self.assertEquals(response.data.id, tmp.id)

我不断收到以下错误:

Traceback(最近一次调用最后一次): 文件“/tests.py”,第 44 行,在 test_view_athlete response = ViewAthlete.as_view()(请求)

文件“/venv/lib/python3.5/site-packages/django/views/decorators/csrf.py”,第 58 行,位于 Wrapped_view 返回 view_func(*args, **kwargs)

文件“/venv/lib/python3.5/site-packages/django/views/generic/base.py”,第 68 行,在视图中 return self.dispatch(request, *args, **kwargs)

文件“/venv/lib/python3.5/site-packages/rest_framework/views.py”,第 474 行,在调度中 响应 = self.handle_exception(exc)

文件“/venv/lib/python3.5/site-packages/rest_framework/views.py”,第 471 行,在调度中 响应 = 处理程序(请求,*args,**kwargs) 类型错误:get() 缺少 1 个必需的位置参数:'id'

据我了解,问题在于,ViewAthelete 视图类的 get 函数没有 id 参数。这是什么原因?在开发环境(非测试)中,它显示数据,但测试环境无法识别来自路由的参数。

【问题讨论】:

【参考方案1】:

正如 zsepi 所说,这里没有使用您的网址。为了避免重复参数,而不是直接调用视图,您可以使用测试客户端“调用”URL:这样做的另一个好处是中间件可以运行,因此您不需要单独分配用户属性。

response = self.client.get('/_api/v1/athletes/' + str(tmp.id)) 

【讨论】:

【参考方案2】:

通过完整的 django 请求堆栈进行测试时会考虑 AFAIK urlpatterns,例如:通过 django.test.Client,使用它的 get/post 方法

当直接测试您的视图 (MyView.as_view()(request)) 时,会绕过整个 url 解析器逻辑,然后需要由调用者提供 args/kwargs(例如:MyView.as_view()(request, 'arg1', 'arg2', id='34')

【讨论】:

以上是关于django test RequestFactory 无法让路由参数工作的主要内容,如果未能解决你的问题,请参考以下文章

Django——test文件编写接口测试

Django终端打印SQL语句和调用test脚本

django开发博客02

使用 selenium 运行 django-test 时出现断管错误

python第三方库系列之十八--python/django test库

Django 1.9.2 测试客户端问题