2010-08-16 10 views
22

Ich versuche, einen Admin-Benutzer als Teil meiner Tests.py zu erstellen, um auf Persmissions zu überprüfen.So erstellen Sie einen Admin-Benutzer in Django tests.py

UPDATE: Die tests.py ist Standardformat, das Testcase und der Code unter Unterklassen wird im Einstellprogramm() Funktion aufgerufen.

Ich kann einen normalen Benutzer, aber keinen Admin-Benutzer erstellen. Wenn ich versuche, dieses:

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

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

ich:

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

Wenn ich die is_staff Linie ist alles gut entfernen (außer ich meinen Test nicht tun können!)

muss ich Admin-Benutzer als Vorrichtungen zu laden haben?

Userprofile ist wie folgt definiert:

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) 

und voller Fehler Zurückverfolgungs ist:

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 

Die Antwort scheint zu sein, dass Sie nicht ein Admin-Benutzer in setUp erstellen können, aber Sie kann in jeder anderen Funktion so, wenn Sie einen Admin-Benutzer im Test wollen, verwenden Sie ein Gerät!

+1

@phoebebright: können Sie Modellcode eingeben? Insbesondere "UserProfile" und seine Beziehung zu "User". –

+0

@phoebebright: Und hast du irgendwelche Fixtures Setup? – sdolan

+0

@phoebebright: Nebenbei bemerkt sollte Ihr 'UserProfile' ->' User'-Verweis ein 'OneToOneField' sein. Siehe http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/ – sdolan

Antwort

4

Update 2

das Snippet Ausgeführt der Superuser aus einem Testfall (Unterklasse von django.test.TestCase) zu erstellen. Alles lief gut. Außerdem wurde eine Instanz von UserProfile mit user = self.adminuser erstellt und gespeichert. Das hat auch funktioniert.

aktualisieren

Diese Linie ist interessant:

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}) 

Sieht aus wie die Ausführung fehlschlägt, wenn Berechtigungen zu schaffen.

Original-Antwort

Achtung: Die Daten abgeschnitten für Spalte 'Name' in Zeile 1

Seltsam. Ich habe das aus der Django-Shell probiert und es hat für mich funktioniert. Ich benutze Postgresql 8.3 und Django 1.2.1 auf Ubuntu Jaunty. Kannst du detaillierter angeben, welche Version von Django/Datenbank du verwendest?

Auch User hat kein name Attribut. Können Sie überprüfen, ob Sie auth.User verwenden?

Muss ich Admin-Benutzer als Fixtures laden?

Sie nicht haben. Aber wenn Sie diesen Admin-Benutzer ausschließlich zu Testzwecken erstellen, wäre es eine gute Idee, ein Fixture hinzuzufügen. Das mache ich in meinen Projekten.

+0

In der Shell versucht und es funktioniert gut. Ich habe userprofile angehängt (das hat keinen Namen drin) und ich kann userprofiles gut für andere Arten von Benutzer hinzufügen, nur nicht Superuser oder Mitarbeiter. Verdutzt! – PhoebeB

+0

@phoebebright: Sagt Ihr Fehler, in welcher Tabelle er auftritt ... ist das die Tabelle auth_user? – sdolan

+0

posted ein bisschen mehr Infos oben. – PhoebeB

47

Ich würde die integrierte create_superuser verwenden und den Benutzer anmelden, bevor Sie irgendwelche Anfragen machen. Folgendes sollte funktionieren:

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

immer noch den gleichen Fehler, wenn ich create_user create_superuser ändern, ohne auch nur versuchen, das Client-Bit zu tun ... – PhoebeB

+1

Dies sollte die akzeptierte Antwort sein! –

+1

Löschen Sie 'c = Client()' und ersetzen Sie 'c.login' durch' self.client.login', wenn Sie innerhalb eines Tests ausgeführt werden, der von 'TestCase' abgeleitet ist – shadi

Verwandte Themen