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を使用:
これは非常にまともなアプローチのようです。これが私の問題を解決するかどうかを知らせます。 – Darwesh
これは、アクセス許可自体が動作していることをテストします。 djangoのテストクライアントを使ってエンドポイントにリクエストを送信して、 '403'が期待通りに返されるようにすることで、パーミッションがビューに正しく適用されていることをテストすることも便利です。 –
本当ですが、OPは 'unit test permissions'への道を尋ねました。統合テストのための方法ではありません。' OrganizationViewSet'です。それにもかかわらず、私は私の答えを更新して、それについてのテストも含めました。 – fips