Comment créer un utilisateur admin dans django tests.py

j'essaie de créer un utilisateur administrateur dans le cadre de mon tests.py pour vérifier les persmissions.

mise à jour: Les tests.py est le format standard qui sous-classe TestCase et le code ci-dessous est appelé dans la fonction setUp ().

je peux créer un utilisateur normal, mais pas un utilisateur admin. Si j'essaie ceci:

    self.adminuser = User.objects.create_user('admin', 'admin@test.com', 'pass')
    self.adminuser.save()
    self.adminuser.is_staff = True
    self.adminuser.save()

ou auto.adminuser = Utilisateur.objet.create_superuser ('admin', 'admin@test.com", "pass") auto.adminuser.save ()

, j'obtiens:

Warning: Data truncated for column 'name' at row 1

si je supprime la ligne is_staff tout va bien (sauf que je ne peux pas faire mon test!)

dois-je charger des utilisateurs admin comme fixtures?

UserProfile est définie comme suit:

class UserProfile(models.Model):

    user = models.ForeignKey(User, unique=True)
    organisation = models.ForeignKey(Organisation, null=True, blank=True)
    telephone = models.CharField(max_length=20, null=True, blank=True)

et plein d'erreur traceback est:

    Traceback (most recent call last):
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/test/testcases.py", line 242, in __call__
        self._pre_setup()
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/test/testcases.py", line 217, in _pre_setup
        self._fixture_setup()
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/test/testcases.py", line 440, in _fixture_setup
        return super(TestCase, self)._fixture_setup()
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/test/testcases.py", line 222, in _fixture_setup
        call_command('flush', verbosity=0, interactive=False)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/__init__.py", line 166, in call_command
        return klass.execute(*args, **defaults)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/base.py", line 222, in execute
        output = self.handle(*args, **options)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/base.py", line 351, in handle
        return self.handle_noargs(**options)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/commands/flush.py", line 61, in handle_noargs
        emit_post_sync_signal(models.get_models(), verbosity, interactive)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/sql.py", line 205, in emit_post_sync_signal
        interactive=interactive)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/dispatch/dispatcher.py", line 166, in send
        response = receiver(signal=self, sender=sender, **named)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/contrib/auth/management/__init__.py", line 28, in create_permissions
        defaults={'name': name, 'content_type': ctype})
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/manager.py", line 123, in get_or_create
        return self.get_query_set().get_or_create(**kwargs)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/query.py", line 335, in get_or_create
        obj.save(force_insert=True)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/base.py", line 410, in save
        self.save_base(force_insert=force_insert, force_update=force_update)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/base.py", line 495, in save_base
        result = manager._insert(values, return_id=update_pk)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/manager.py", line 177, in _insert
        return insert_query(self.model, values, **kwargs)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/query.py", line 1087, in insert_query
        return query.execute_sql(return_id)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/sql/subqueries.py", line 320, in execute_sql
        cursor = super(InsertQuery, self).execute_sql(None)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/sql/query.py", line 2369, in execute_sql
        cursor.execute(sql, params)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/backends/mysql/base.py", line 84, in execute
        return self.cursor.execute(query, args)
      File "build/bdist.linux-x86_64/egg/MySQLdb/cursors.py", line 175, in execute
      File "build/bdist.linux-x86_64/egg/MySQLdb/cursors.py", line 89, in _warning_check
      File "/usr/lib64/python2.4/warnings.py", line 61, in warn
        warn_explicit(message, category, filename, lineno, module, registry)
      File "/usr/lib64/python2.4/warnings.py", line 96, in warn_explicit
        raise message
    Warning: Data truncated for column 'name' at row 1

la réponse semble être que vous ne pouvez pas créer un administrateur utilisateur dans setUp mais vous pouvez dans n'importe quelle autre fonction donc si vous voulez un utilisateur administrateur dans testing, utilisez un fixture!

24
demandé sur PhoebeB 2010-08-16 20:20:06

2 réponses

Update 2

a exécuté le snippet pour créer le super-utilisateur à partir d'un cas d'essai (sous-classe de django.test.TestCase ). Tout s'est bien passé. A également créé et enregistré une instance de UserProfile avec user = self.adminuser . Que trop travaillé.

mise à Jour

cette ligne est intéressante:

File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/contrib/auth/management/__init__.py", line 28, in create_permissions
        defaults={'name': name, 'content_type': ctype})

ressemble à une exécution qui échoue lors de la création des permissions.

Réponse Originale À Cette Question

avertissement: données tronquées pour la colonne "nom" à la ligne 1

Strange. J'ai essayé ça avec la coquille de Django et ça a marché pour moi. J'utilise Postgresql 8.3 et Django 1.2.1 sur Ubuntu Jaunty. Pouvez-vous donner plus de détails sur la version de Django/base de données que vous utilisez?

aussi User n'a pas de name attribut. Pouvez-vous revérifier si vous utilisez auth.User ?

dois-je charger des utilisateurs admin comme fixtures?

Vous n'avez pas . Mais si vous créez cet utilisateur administrateur uniquement à des fins de test, alors ce serait une bonne idée d'ajouter un Fixture. Qu'est ce que je fais dans mes projets.

4
répondu Manoj Govindan 2010-08-16 17:26:26

j'utiliserais le create_superuser et logerais l'utilisateur avant de faire des requêtes.

from django.contrib.auth.models import User
from django.test.client import Client

# store the password to login later
password = 'mypassword' 

my_admin = User.objects.create_superuser('myuser', 'myemail@test.com', password)

c = Client()

# You'll need to log him in before you can send requests through the client
c.login(username=my_admin.username, password=password)

# tests go here
48
répondu Sam Dolan 2010-08-16 16:33:32