2010-08-16 3 views
22

J'essaie de créer un utilisateur admin dans le cadre de mes tests.py pour vérifier les persmissions.Comment créer un utilisateur admin dans django tests.py

MISE À JOUR: Le test.py est un 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 administrateur. Si j'essaie ceci:

self.adminuser = User.objects.create_user('admin', '[email protected]', 'pass') 
    self.adminuser.save() 
    self.adminuser.is_staff = True 
    self.adminuser.save() 

OU self.adminuser = User.objects.create_superuser ('admin', '[email protected]', 'pass') self.adminuser.save()

je reçois:

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 les utilisateurs admin comme accessoires?

UserProfile est défini 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 retraçage d'erreur 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 utilisateur admin dans setUp mais vous peut dans toute autre fonction, donc si vous voulez un utilisateur admin dans les tests, utilisez un appareil!

+1

@phoebebright: pouvez-vous poster le code du modèle? Plus précisément, 'UserProfile' et sa relation avec' User'. –

+0

@phoebebright: Et avez-vous des configurations d'appareils? – sdolan

+0

@phoebebright: D'un côté, votre référence 'UserProfile' ->' User' devrait être 'OneToOneField'. Voir http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/ – sdolan

Répondre

4

Mise à jour 2

Exécuté l'extrait pour créer le super-utilisateur à partir d'un cas de test (sous-classe de django.test.TestCase). Tout s'est bien passé. Également créé et enregistré une instance de UserProfile avec user = self.adminuser. Cela aussi a fonctionné.

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 exécution échoue lors de la création d'autorisations.

Réponse originale

Avertissement: Les données tronquées pour la colonne 'nom' à la ligne 1

étrange. J'ai essayé ça depuis le shell 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?

De même, User n'a pas d'attribut name. Pouvez-vous vérifier si vous utilisez auth.User?

Dois-je charger des utilisateurs admin en tant qu'appareils?

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

+0

Essayé en shell et ça marche bien. J'ai userprofile attaché (qui n'a pas de nom dedans) et je peux ajouter des userprofiles bien pour d'autres types d'utilisateur, juste pas superutilisateur ou personnel. Déconcerté! – PhoebeB

+0

@phoebebright: Est-ce que votre erreur indique la table dans laquelle elle se trouve ... est-ce la table auth_user? – sdolan

+0

posté un peu plus d'infos ci-dessus. – PhoebeB

47

J'utiliserais le create_superuser intégré et connectez l'utilisateur avant de faire des demandes. Ce qui suit devrait fonctionner:

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', '[email protected]', 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 
+0

toujours obtenir la même erreur lorsque je change create_user à create_superuser, sans même essayer de faire le bit client ... – PhoebeB

+1

Cela devrait être la réponse acceptée! –

+1

Supprime 'c = Client()' et remplace 'c.login' par' self.client.login' lorsqu'il est exécuté depuis un test héritant de 'TestCase' – shadi