2016-05-11 18 views
3

Hersは単体テストにしたいサンプルの許可です。ここdjango-rest-frameworkのテスト権限をどのようにするのですか?

# permissions.py 

from myapp.models import Membership 

class IsOrganizationOwner(permissions.BasePermission): 
    """ 
    Custom permission to allow only owner of the organization to do a certian task. 
    """ 
    def has_object_permission(self, request, view, obj): 
     try: 
      membership = Membership.objects.get(user = request.user, organization = obj) 
     except Membership.DoesNotExist: 
      return False 

     return membership.is_admin 

とは、それが今、私はジャンゴでのテストに非常に新しいです

# viewsets.py 
class OrganizationViewSet(viewsets.ModelViewSet): 
    """ 
    API endpoint that allows Organizations to be viewed or edited. 
    """ 
    permission_classes = (permissions.IsAuthenticated, IsOrganizationOwner,) 
    queryset = Organization.objects.all().order_by('name') 
    serializer_class = OrganizationSerializer 

を適用していると私はこの権限をテストする方法がわからない方法です。どんな助けもありがとう。
from django_mock_queries.query import MockSet 
from mock import patch, MagicMock 
from unittest import TestCase 


class TestPermissions(TestCase): 
    memberships = MockSet() 
    patch_memberships = patch('myapp.models.Membership.objects', memberships) 

    def setUp(self): 
     self.permission = IsOrganizationOwner() 

     self.memberships.clear() 
     self.request = MagicMock(user=MagicMock()) 
     self.view = MagicMock() 

    def create_membership(self, organization, is_admin): 
     self.request.user.is_admin = is_admin 
     self.memberships.add(
      MagicMock(user=self.request.user, organization=organization) 
     ) 

    @patch_memberships 
    def test_permissions_is_organization_owner_returns_false_when_membership_does_not_exist(self): 
     org = MagicMock() 
     self.assertFalse(self.permission.has_object_permission(self.request, self.view, org)) 

    @patch_memberships 
    def test_permissions_is_organization_owner_returns_false_when_membership_is_not_admin(self): 
     org = MagicMock() 
     self.create_membership(org, False) 
     self.assertFalse(self.permission.has_object_permission(self.request, self.view, org)) 

    @patch_memberships 
    def test_permissions_is_organization_owner_returns_true_when_membership_is_admin(self): 
     org = MagicMock() 
     self.create_membership(org, True) 
     self.assertTrue(self.permission.has_object_permission(self.request, self.view, org)) 

が、私はモックジャンゴクエリセットの機能は、テストはより小さく、より読みやすくすることを書いた libraryを使用:

答えて

3

は、ここに1つのアプローチです。しかし、好きな場合は、MockまたはMagicMockを使用して、必要なものだけをパッチすることができます。

EDIT:完全を期すのは、あなたはまた、統合テストOrganizationViewSetに望んでいたと仮定しましょうについては、ここでそのためのいくつかのテストがあります:他の人のよう

from django.contrib.auth.models import User 
from django.test import TestCase, Client 
from model_mommy import mommy 


class TestOrganizationViewSet(TestCase): 
    url = '/organizations/' 

    def create_user(self, is_admin): 
     password = 'password' 

     user = mommy.prepare(User, is_admin=is_admin) 
     user.set_password(password) 
     user.save() 

     return user, password 

    def get_organizations_as(self, user=None, password=None): 
     api = Client() 

     if user: 
      mommy.make(Membership, user=user, organization=mommy.make(Organization)) 
      api.login(username=user.username, password=password) 

     return api.get(self.url) 

    def test_organizations_viewset_returns_200_for_admins(self): 
     response = self.get_organizations_as(*self.create_user(True)) 
     self.assertEqual(response.status_code, 200) 

    def test_organizations_viewset_returns_403_for_non_admins(self): 
     response = self.get_organizations_as(*self.create_user(False)) 
     self.assertEqual(response.status_code, 403) 

    def test_organizations_viewset_returns_403_for_anonymous(self): 
     response = self.get_organizations_as() 
     self.assertEqual(response.status_code, 403) 

指摘している、あなたもこれらのテストを必要とするだけではありません可能なすべてのテストケースに対してユニットテストはそのために最適です。統合テストではデータベースなどに書き込むので、CIの手順が遅くなります。

+0

これは非常にまともなアプローチのようです。これが私の問題を解決するかどうかを知らせます。 – Darwesh

+1

これは、アクセス許可自体が動作していることをテストします。 djangoのテストクライアントを使ってエンドポイントにリクエストを送信して、 '403'が期待通りに返されるようにすることで、パーミッションがビューに正しく適用されていることをテストすることも便利です。 –

+0

本当ですが、OPは 'unit test permissions'への道を尋ねました。統合テストのための方法ではありません。' OrganizationViewSet'です。それにもかかわらず、私は私の答えを更新して、それについてのテストも含めました。 – fips

関連する問題