I want to test some views in the Django REST Framework (DRF) project.
The problem comes when I try to check views that have arguments in the URLs.
url(r'^(?Pcompany_hash>[\d\w]+)/(?Ptimestamp>[\.\d]*)/employees/$',
EmployeeList.as_view(), name='employeelist'),
("<" in URLs has been deleted on purpose. Just it isn’t considered a tag and thus is not shown)
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())
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)
I'm getting this error:
company_hash = self.kwargs['company_hash']
KeyError: 'company_hash'
That is, the args aren't been passed to the view.
I've tried in so many different ways to pass by the args, but I can't find a solution.
I just found the problem!!
I was using APIRequestFactory() and should have been using the build in client factory from the APITestCase test class from Django REST Framework.