Найти - Пользователи
Полная версия: Как написать тест для admin.ModelAdmin, использующей request.user?
Начало » Django » Как написать тест для admin.ModelAdmin, использующей request.user?
1
Elaphe
В одной из admin.ModelAdmin при сохраненни модели используется request.user (ничего экзотического, просто сохраняет создателя объекта и последнего редактировавшего).
Хотелось бы проверить данную функцию.
К сожалению, в Client не предусмотрено добавление аттрибуда user, даже после выполнения force_login
Попытка сделать
 setattr(response.request, 'user', self.superuser)
приводит к ошибке:
File “tests.py”, line 47, in test_create_maillist
setattr(response.request, ‘user’,self.superuser)
AttributeError: ‘dict’ object has no attribute ‘user’
Попытка протестировать с помощью RequestFactory и добавления пользователя:
request = self.factory.get(myurl)
request.user = self.superuser
create = ModelAdmin(MyModel, admin.site).add_view(request)
Не привела к успеху. Объект создался, но поля, в которые должен был быть добавлен пользователь из реквеста, пустые.
Помогите, пожалуйста.
FishHook
Elaphe
AttributeError: ‘dict’ object has no attribute ‘user’
Ну дык, если это dict, то очевидно, что делать надо как-то так
 response.request['user'] = self.superuser
Elaphe
Увы, не поможет. Тогда он вьюхой не будет нормально извлекаться, т.к. вьюха берет юзера, как аттрибут, а не как значение словаря.
FishHook
 from django.contrib.auth.models import AnonymousUser, User
from django.test import TestCase, RequestFactory
from .views import MyView, my_view
class SimpleTest(TestCase):
    def setUp(self):
        # Every test needs access to the request factory.
        self.factory = RequestFactory()
        self.user = User.objects.create_user(
            username='jacob', email='jacob@…', password='top_secret')
    def test_details(self):
        # Create an instance of a GET request.
        request = self.factory.get('/customer/details')
        # Recall that middleware are not supported. You can simulate a
        # logged-in user by setting request.user manually.
        request.user = self.user
        # Or you can simulate an anonymous user by setting request.user to
        # an AnonymousUser instance.
        request.user = AnonymousUser()
        # Test my_view() as if it were deployed at /customer/details
        response = my_view(request)
        # Use this syntax for class-based views.
        response = MyView.as_view()(request)
        self.assertEqual(response.status_code, 200)
Elaphe
Я при использовании RequestFactory пользователь не добавляется, см. верхний пост.
Объект создается, но поле creator и editor пустые.
FishHook
Elaphe
Elaphe
Покажите код
Elaphe
 import random
from django.test import TestCase, Client, RequestFactory
from django.contrib.auth import get_user_model
from django.shortcuts import reverse
from django.contrib import admin
from rest_framework.test import APIClient
from mirror.core import fixtures
from mirror.maillists import models as maillist_models
from mirror.maillists import admin as maillist_admin
from mirror.clients import models as client_models
from mirror.users.management.commands import init_core
User = get_user_model()
class MaillistTestCase(TestCase):
    @classmethod
    def setUpClass(cls):
        super(MaillistTestCase, cls).setUpClass()
        cls.cilent = Client()
        cls.factory = RequestFactory()
        apiclient = APIClient()
        command = init_core.Command()
        superuser_email = 'system{}@email.test'.format(str(random.randint(0, 10 ** 5)))
        command.handle(superuser_email=superuser_email)
        cls.superuser = User.objects.get(email=superuser_email)
        #create first user 
        shopper_register_data, cls.shopper_login_data = fixtures.get_shopper_data()
        response = apiclient.post(reverse('api:user-list'), data=shopper_register_data)
        cls.shopper = response.data
        cls.maillists = maillist_models.Maillist.objects.all()
    def test_create_maillist(self):
        self.client.force_login(self.superuser)
        maillist_data = fixtures.get_maillist_data(self.shopper['user_id'])
        response = self.client.get(reverse('admin:maillists_maillist_add'))
        self.assertEqual(response.status_code, 200)
        self.client.force_login(self.superuser)
        response = self.factory.post(reverse('admin:maillists_maillist_add'), data=maillist_data)
        response.user = self.superuser
        reply = maillist_admin.MaillistAdmin(maillist_models.Maillist, admin.site)
        print(reply.add_view(response))
        #maillist created
        self.assertEqual(self.maillists.count(), 1)
        maillist = self.maillists.first()
        #creator added to maillist
        print('creator', maillist.creator)
        print('editor', maillist.editor)
        print(self.superuser.id)
FishHook
Elaphe
Вы меня извините, но я не могу понять, где и что вы создаете. Более того, мне не очень понятно, зачем вообще тестировать админку, то есть что именно вы тестируете.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB