0

これが私がやろうとしていることです。

  1. mixin を使用して、オブジェクトの所有権を検証します。

  2. 詳細 URL をテストして、request.user == obj.owner であることを確認します。

詳細テストは 200 アサーションでパスすることを期待しています。しかし、それは私に 302 を与えていrequest.userますowner

これが私のミックスインです:

from django.contrib.auth.mixins import UserPassesTestMixin

class IsOwnerMixin(UserPassesTestMixin):
    """
    a custom mixin that checks to see if the user is the owner of the object
    """

    def test_func(self):

        # get the object

        obj = self.get_object()

        # if the obj.user == the logged in user they can see it otherwise boo!

        if self.request.user == obj.owner:
            return True
        else:
            return False

これが私の見解です:

class AwesomeDetail(LoginRequiredMixin, IsOwnerMixin, DetailView):
    """
    An awesome detail
    """
    model = models.Awesome
    template_name = "awesomeness/detail.html"

これが私のテストです:

from django.test import TestCase, RequestFactory
from django.test.client import Client
from django.contrib.auth.models import AnonymousUser, User, Group
from project.awesomness import views, models

class UrlsViewsTest(TestCase):
    def setUp(self):
        self.factory = RequestFactory()
        self.user = User.objects.create_user(id='1', username='name', email='email@email.com', password='top_secret')
        self.awesome = models.Awesome.objects.create(id='2', owner=self.user)
        self.not_owner = User.objects.create_user(id='3', username='trouble', email='otheremail@otheremail.com', password='top_secret')

    def test_awesome_detail(self):
        """
        Test the awesome detail URL
        """
        request = self.factory.get('/awesome/2/')
        request.user = self.user
        response = views.AwesomeDetail.as_view()(request, pk=2)
        self.assertEqual(response.status_code, 200)

    def test_awesome_not_owner(self):
        """
        Test the awesome detail with a user that is not the owner
        """
        request = self.factory.get('/awesome/2/')
        request.user = self.not_owner
        response = views.AwesomeDetail.as_view()(request, pk=2)
        self.assertEqual(response.status_code, 302)

    def test_awesome_detail_anonymous_user(self):
        """
        Test the awesome detail with a user that is anonymous
        """
        request = self.factory.get('/awesome/2/')
        request.user = AnonymousUser()
        response = views.AwesomeDetail.as_view()(request, pk=2)
        self.assertEqual(response.status_code, 302)

最後に、結果は次のとおりです。

Creating test database for alias 'default'...
F..
======================================================================
FAIL: test_awesome_detail (project.awesomeness.tests.UrlsViewsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/dave/sandbox/project/project/awesomeness/tests.py", line 25, in test_awesome_detail
    self.assertEqual(response.status_code, 200)
AssertionError: 302 != 200

----------------------------------------------------------------------
Ran 3 tests in 0.202s

FAILED (failures=1)
Destroying test database for alias 'default'...
4

0 に答える 0