Python 如何测试Django中的工作人员用户是否只能访问视图

Python 如何测试Django中的工作人员用户是否只能访问视图,python,django,django-testing,python-decorators,django-tests,Python,Django,Django Testing,Python Decorators,Django Tests,我正在Django学习测试,并且有一个我想要测试的观点。此视图只能由员工用户访问。假设视图为: def staff_users(request): .... # some logic return HttpResponseRedirect('/repositories/') 如果请求来自员工用户,它应该重定向到存储库,否则我应该得到类似于权限被拒绝的消息。我从类似于intests.py的内容开始 def test_request_object(self):

我正在Django学习测试,并且有一个我想要测试的观点。此视图只能由员工用户访问。假设视图为:

def staff_users(request):
    ....
    # some logic

    return HttpResponseRedirect('/repositories/')
如果请求来自员工用户,它应该重定向到存储库,否则我应该得到类似于
权限被拒绝的消息。我从类似于in
tests.py的内容开始

 def test_request_object(self):
        self.user = User.objects.create_user(
        username='abc', email='abc@gmail.com', password='1234')
        request = HttpRequest()
        # User send a request to access repositories
        response = staff_users(request)
        self.assertIsNone(response)

问题在于,我没有将我的请求对象与任何用户关联,我还从django.contrib.admin.views.decorators中了解了
,但不确定如何在此处使用它们。谁能告诉我应该如何测试我的
视图
只能由
员工用户访问

您需要做的就是装饰您想要保护的视图,如下所示:

@staff_member_required
def staff_users(request):
    ....
    # some logic

    return HttpResponseRedirect('/repositories/')
如果您想要一个用于测试的自定义逻辑,而不是使用django decorator,那么您也可以编写自己的decorator

def staff_users_only(function):
  def wrap(request, *args, **kwargs):

        profile = request.session['user_profile']
        if profile is True: #then its a staff member
             return function(request, *args, **kwargs)
        else:
            return HttpResponseRedirect('/')

  wrap.__doc__=function.__doc__
  wrap.__name__=function.__name__
  return wrap
并将其用作:

@staff_users_only
def staff_users(request):
    ....
    # some logic

    return HttpResponseRedirect('/repositories/')
编辑

测试的请求对象关联可以通过以下方式完成:

def test_request_object(self):
    self.user = User.objects.create_user(
    username='abc', email='abc@gmail.com', password='1234')
    request = HttpRequest()
    #create a session which will hold the user profile that will be used in by our custom decorator
    request.session = {} #Session middleware is not available in UnitTest hence create a blank dictionary for testing purpose
    request.session['user_profile'] = self.user.is_staff #assuming its django user.

    # User send a request to access repositories
    response = staff_users(request)

    #Check the response type for appropriate action
    self.assertIsNone(response)
编辑2

使用django库进行测试也是一个更好的主意:

>>> from django.test import Client
>>> c = Client()
>>> response = c.post('/login/', {'username': 'abc', 'password': '1234'})
>>> response.status_code
200
>>> response = c.get('/user/protected-page/')
>>> response.content
b'<!DOCTYPE html...
来自django.test导入客户端的
>>
>>>c=客户机()
>>>response=c.post('/login/',{'username':'abc','password':'1234})
>>>response.status\u代码
200
>>>response=c.get(“/user/protected page/”)
>>>答复.内容

b'请同时显示完成完整装饰的标准方式:
@wrapps(function)
def wrapp(request,
前面,但测试用例如何,我将如何将我的请求与员工用户或普通用户关联?如果您看到我的
测试函数
,我使用的是
request=HttpRequest()
获取请求对象。我如何将我的请求对象与员工或普通用户关联?@Pynchia请解释更多,我不清楚你的意思。现在这完全有道理了:)希望我能多次投票。让我试试你的建议,然后我会接受的。