首页 文章

我怎样才能正确地将参数传递给测试Django Rest Framework的classbasedviews?

提问于
浏览
0

我想在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'

那是args没有被传递给视图 .

我尝试过这么多不同的方式来传递args,找不到解决方案 .

欢迎任何帮助!

3 回答

  • 3

    刚发现问题!!

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

  • -1

    你只需要在调用 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
    

    所以你的论证将被正确传递 .

    NB: 我根据我对 APIRequestfactory ,Django RequestFactory 母班的经验使用了这个解决方案 .

  • -1

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

    (?<P
    

    而不是

    (?P<
    

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

    -詹姆士

相关问题