如何正确地将参数传递给基于类的视图测试 Django Rest Framework?

Posted

技术标签:

【中文标题】如何正确地将参数传递给基于类的视图测试 Django Rest Framework?【英文标题】:How can i correctly pass arguments to classbasedviews testing Django Rest Framework? 【发布时间】:2015-10-03 01:25:48 【问题描述】:

我想测试 DRF 项目中的一些视图。

当我尝试检查在 url 中有参数的视图时,问题就出现了。

urls.py

url(r'^(?Pcompany_hash>[\d\w]+)/(?Ptimestamp>[\.\d]*)/employees/$', EmployeeList.as_view(), name='employeelist'),

[编辑:url中的“

views.py

EmployeeList 类(ListCreateAPIView): serializer_class= EmployeeDirectorySerializer def inner_company(self): company_hash = self.kwargs['company_hash'] 返回 get_company(company_hash) def get_queryset(self): 返回 Employee.objects.filter(company=self.inner_company())

test.py

类 ApiTests(APITestCase): 默认设置(自我): self.factory = APIRequestFactory() self.staff = mommy.make('directory.Employee', user__is_staff=True) self.employee = mommy.make('directory.Employee') self.hash = self.employee.company.company_hash def getResponse(self, url, myView, kwargs): 视图 = myView.as_view() 请求 = self.factory.get(url, kwargs) force_authenticate(请求,用户=用户) 响应 = 查看(请求) 返回响应 def test_EmployeeList(self): kwargs = 'timestamp': 0, 'company_hash': self.hash url = reverse('员工列表', kwargs=kwargs) 测试视图 = EmployeeList 响应 = self.getResponse(url, 测试视图, kwargs=kwargs) self.assertEqual(response.status_code, 200)

我收到了这个错误

company_hash = self.kwargs['company_hash'] KeyError:'company_hash'

也就是说参数没有被传递给视图。

我尝试了很多不同的方法来传递参数,但找不到解决方案。

欢迎任何帮助!

【问题讨论】:

您的urls.py 输入错误。试试url(r'^(?P<company_hash>[\d\w]+)/(?P<timestamp>[\.\d]*)/employees/$', EmployeeList.as_view(), name='employeelist'), 感谢 Pynchia,但只是退出 【参考方案1】:

在您的 URL conf 中检查您的正则表达式语法。您没有正确捕获命名组。你有

(?<P 

而不是

(?P<

https://docs.djangoproject.com/en/1.8/topics/http/urls/#named-groups

-詹姆斯

【讨论】:

为什么投反对票?两个答案都是正确的,我的例子是我也发送给 Django-users 组的答案,其中包含我在这里指出的错字。由于与 OP 相同的问题,我还遇到了一些可怕的格式问题。 您好 James,感谢您指出 url 中的问题...正确的格式应该正确,实际上在项目中正确完成...只是我拿出了“ 【参考方案2】:

刚刚发现问题!!

我正在使用 APIRequestFactory() 并且应该一直在使用来自 Django Rest Framework 的 APITestCase 测试类的客户端工厂中的构建

【讨论】:

【参考方案3】:

你只需要在调用get()方法时再次指定你的kwargs:

...
...
    def getResponse(self, url, myView, kwargs):
        view = myView.as_view()
        request = self.factory.get(url, kwargs)
        ...
        response = view(request, company_hash=kwargs['company_hash'])
        return response

所以你的论点将被正确传递。

注意:我使用此解决方案是基于我对 APIRequestfactory 母类 Django RequestFactory 的经验。

【讨论】:

以上是关于如何正确地将参数传递给基于类的视图测试 Django Rest Framework?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将参数传递给 joomla 组件?

如何正确地将参数传递给rails表单

Django:将字符串参数传递给基于类的视图不起作用

如何最好地将 CString 转换为 BSTR 以将其作为“in”参数传递给 COM 方法?

如何使用 jquery ajax 正确地将 json 对象传递给烧瓶服务器

如何将视图输入参数传递给 @State 变量?