关于python:如何正确地将参数传递给测试django-rest框架的ClassBasedView?

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/命名组

-杰姆斯


调用get()方法时只需再次指定Kwarg即可:

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测试类中的内置客户端工厂。