Tests für View schreiben - User login scheitert
Verfasst: Samstag 24. Juli 2021, 07:50
Hi, ich möchte ab nun Tests für meine Views schreiben. Meine Views sind eig. alle durch CustomPermissions (abgeleitet von rest_framework.permissions.BasePermission) entsprechend geschützt.
Der Login erfolgt über Token. Ein Test könnte so aussehen:
c.force_login gibt None zurück.
Ich habe auch schon versucht (da ich es ja so auch in Postman machen würde), den Token beim request mitzugeben, anstatt einen login zu forcieren (so erfolgt es ja in 'echt'):
Klappt leider auch nicht.
Die Fehlermeldung, wenn ich per Tests ausführe, lautet:
Ich habe schon einige Stunden verbracht und alles mögliche ausprobiert, bin aber leider nicht weitergekommen.
Noch relevant zu wissen: Ich habe ein CustomUserModel:
Vielen Dank schonmal, ich hoffe ich hab alles notwendige reingepackt.
Der Login erfolgt über Token. Ein Test könnte so aussehen:
Code: Alles auswählen
class OrganizationCreateTests(TestCase):
def setUp(self):
password = "password123!"
email = "testmail@test.de"
self.user = get_user_model().objects.create_user(email=email, password=password)
def test_create(self):
c = Client()
c.force_login(self.user)
response = c.post(reverse(OrganizationCreateView.__name__),{'Test_attr':'Test'})Ich habe auch schon versucht (da ich es ja so auch in Postman machen würde), den Token beim request mitzugeben, anstatt einen login zu forcieren (so erfolgt es ja in 'echt'):
Code: Alles auswählen
header = {'Authorization':f'Token {self.token}'}
response = self.client.post(reverse(OrganizationCreateView.__name__), header)
Die Fehlermeldung, wenn ich per
Code: Alles auswählen
py manage.py testEs hängt also in meiner Permission fest, und zwar, weil ich nicht Authorisiert bin und dadurch der Request durch den AnonymousUser ausgeführt wird, der mein Attribut eben nicht kennt.Traceback (most recent call last):
File "C:\Users\Robin\dev\rechnuwo-projekt\rechnuwo_proj\rechnuwo\tests.py", line 123, in test_create2
response = c.post(reverse(OrganizationCreateView.__name__),{'organization_name':'TestOrgaName'})
File "C:\Users\Robin\dev\rechnuwo-projekt\env-backend\lib\site-packages\django\test\client.py", line 751, in post
response = super().post(path, data=data, content_type=content_type, secure=secure, **extra)
File "C:\Users\Robin\dev\rechnuwo-projekt\env-backend\lib\site-packages\django\test\client.py", line 407, in post
return self.generic('POST', path, post_data, content_type,
File "C:\Users\Robin\dev\rechnuwo-projekt\env-backend\lib\site-packages\django\test\client.py", line 473, in generic
return self.request(**r)
File "C:\Users\Robin\dev\rechnuwo-projekt\env-backend\lib\site-packages\django\test\client.py", line 719, in request
self.check_exception(response)
File "C:\Users\Robin\dev\rechnuwo-projekt\env-backend\lib\site-packages\django\test\client.py", line 580, in check_exception
raise exc_value
File "C:\Users\Robin\dev\rechnuwo-projekt\env-backend\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Users\Robin\dev\rechnuwo-projekt\env-backend\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\Robin\dev\rechnuwo-projekt\env-backend\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "C:\Users\Robin\dev\rechnuwo-projekt\env-backend\lib\site-packages\django\views\generic\base.py", line 70, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\Robin\dev\rechnuwo-projekt\env-backend\lib\site-packages\rest_framework\views.py", line 509, in dispatch
response = self.handle_exception(exc)
File "C:\Users\Robin\dev\rechnuwo-projekt\env-backend\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "C:\Users\Robin\dev\rechnuwo-projekt\env-backend\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
raise exc
File "C:\Users\Robin\dev\rechnuwo-projekt\env-backend\lib\site-packages\rest_framework\views.py", line 497, in dispatch
self.initial(request, *args, **kwargs)
File "C:\Users\Robin\dev\rechnuwo-projekt\env-backend\lib\site-packages\rest_framework\views.py", line 415, in initial self.check_permissions(request)
File "C:\Users\Robin\dev\rechnuwo-projekt\env-backend\lib\site-packages\rest_framework\views.py", line 332, in check_permissions
if not permission.has_permission(request, self):
File "C:\Users\Robin\dev\rechnuwo-projekt\rechnuwo_proj\rechnuwo\permissions.py", line 21, in has_permission
return request.user.organization is None
AttributeError: 'AnonymousUser' object has no attribute 'organization'
Ich habe schon einige Stunden verbracht und alles mögliche ausprobiert, bin aber leider nicht weitergekommen.
Noch relevant zu wissen: Ich habe ein CustomUserModel:
Code: Alles auswählen
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(_('email address'), unique=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
date_joined = models.DateTimeField(default=timezone.now)
organization = models.ForeignKey(Organization, on_delete=models.SET_NULL, related_name="staff", null=True, blank=True)
isOrganizationAdmin = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = CustomUserManager()
def __str__(self):
return self.email