How can i correctly pass arguments to classbasedviews testing Django Rest Framework?
我想在DRF项目中测试一些视图。
当我试图检查在URL中有参数的视图时,问题就出现了。
URLS.Py
1 2 | url(r'^(?Pcompany_hash>[\d\w]+)/(?Ptimestamp>[\.\d]*)/employees/$', EmployeeList.as_view(), name='employeelist'), |
[编辑:URL中的"<"已被有意删除,只是它不被视为标记,因此不显示]
VIEW
1 2 3 4 5 6 7 8 9 | class EmployeeList(ListCreateAPIView): serializer_class = EmployeeDirectorySerializer def inner_company(self): company_hash = self.kwargs['company_hash'] return get_company(company_hash) def get_queryset(self): return Employee.objects.filter(company=self.inner_company()) |
Py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class ApiTests(APITestCase): def setUp(self): 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): view = myView.as_view() request = self.factory.get(url, kwargs) force_authenticate(request, user=user) response = view(request) return response def test_EmployeeList(self): kwargs = {'timestamp': 0, 'company_hash': self.hash} url = reverse('employeelist', kwargs=kwargs) testedView = EmployeeList response = self.getResponse(url, testedView, kwargs=kwargs) self.assertEqual(response.status_code, 200) |
我有这个错误
1 2 | company_hash = self.kwargs['company_hash'] KeyError: 'company_hash' |
这是参数没有传递给视图。
我尝试过很多不同的方法来通过args,找不到解决方案。
欢迎任何帮助!
请检查URL配置中的regex语法。您没有正确捕获命名组。你有
1 | (?<P |
而不是
1 | (?P< |
https://docs.djangoproject.com/en/1.8/topics/http/urls/命名组
-杰姆斯
调用
1 2 3 4 5 6 7 8 | ... ... 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的母类中的经验,我使用了这个解决方案。
刚发现问题!!
我正在使用apiRequestFactory()。并且应该使用django rest框架的apitesscase测试类中的内置客户端工厂。