2

私は Django でのテストを学んでおり、テストしたいビューがあります。このビューには、スタッフ ユーザーのみがアクセスする必要があります。ビューが次のとおりであるとします。

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

    return HttpResponseRedirect('/repositories/')

リクエストがスタッフ ユーザーからのものである場合は、リポジトリにリダイレクトする必要があります。それ以外の場合は、 permission denied. のようなものから始めてい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)

from django.contrib.admin.views.decorators import staff_member_requiredここでの問題は、リクエストオブジェクトをユーザーに関連付けていないことです。また、ここでそれらを使用する方法についても知りましたが、わかりません。viewのみがアクセスする必要があることをテストする方法を誰か教えてもらえますstaff usersか?

4

1 に答える 1

4

あなたがする必要があるのはdecorate、以下に示すように、保護したいビューだけです:

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

    return HttpResponseRedirect('/repositories/')

django デコレーターを使用する代わりにテスト用のカスタム ロジックが必要な場合は、独自のデコレーターを作成することもできます。

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

また、テストに djangoClientライブラリを使用することをお勧めします。

>>> 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...
于 2015-11-08T03:42:23.193 に答える