我如何正确地将参数传递给测试 Django Rest Framework 的 classbasedviews?
How can i correctly pass arguments to classbasedviews testing Django Rest Framework?
我想在 DRF 项目中测试一些视图。
当我尝试检查 url 中有参数的视图时出现问题。
urls.py
url(r'^(?Pcompany_hash>[\d\w]+)/(?Ptimestamp>[\.\d]*)/employees/$',
EmployeeList.as_view(), name='employeelist'),
[编辑:url 中的“<”已被故意删除,只是它不被视为标签,因此未显示]
views.py
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())
test.py
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)
我遇到了这个错误
company_hash = self.kwargs['company_hash']
KeyError: 'company_hash'
那是参数没有传递给视图。
我试过很多不同的方法来传递参数,找不到解决方案。
欢迎任何帮助!
检查 URL conf 中的正则表达式语法。您没有正确捕获命名组。你有
(?<P
而不是
(?P<
https://docs.djangoproject.com/en/1.8/topics/http/urls/#named-groups
-詹姆斯
刚发现问题!!
我正在使用 APIRequestFactory()
并且应该一直使用来自 Django Rest Framework
的 APITestCase 测试 class 的内置客户端工厂
你只需要在调用 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 的母亲 class 的经验使用了这个解决方案,Django RequestFactory.
我想在 DRF 项目中测试一些视图。
当我尝试检查 url 中有参数的视图时出现问题。
urls.py
url(r'^(?Pcompany_hash>[\d\w]+)/(?Ptimestamp>[\.\d]*)/employees/$', EmployeeList.as_view(), name='employeelist'),
[编辑:url 中的“<”已被故意删除,只是它不被视为标签,因此未显示]
views.py
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())
test.py
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)
我遇到了这个错误
company_hash = self.kwargs['company_hash'] KeyError: 'company_hash'
那是参数没有传递给视图。
我试过很多不同的方法来传递参数,找不到解决方案。
欢迎任何帮助!
检查 URL conf 中的正则表达式语法。您没有正确捕获命名组。你有
(?<P
而不是
(?P<
https://docs.djangoproject.com/en/1.8/topics/http/urls/#named-groups
-詹姆斯
刚发现问题!!
我正在使用 APIRequestFactory() 并且应该一直使用来自 Django Rest Framework
的 APITestCase 测试 class 的内置客户端工厂你只需要在调用 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 的母亲 class 的经验使用了这个解决方案,Django RequestFactory.