test - pruebas unitarias django
Cómo crear un usuario administrador en django tests.py (2)
Yo uso el create_superuser
y registro al usuario antes de hacer cualquier solicitud. Lo siguiente debería funcionar:
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
Estoy tratando de crear un usuario administrador como parte de mi tests.py para verificar los permisos.
ACTUALIZACIÓN: El tests.py es el formato estándar al que se llama subclases TestCase y el código a continuación en la función setUp ().
Puedo crear un usuario normal pero no un usuario administrador. Si intento esto:
self.adminuser = User.objects.create_user(''admin'', ''[email protected]'', ''pass'')
self.adminuser.save()
self.adminuser.is_staff = True
self.adminuser.save()
O self.adminuser = User.objects.create_superuser (''admin'', ''[email protected]'', ''pass'') self.adminuser.save ()
Yo obtengo:
Warning: Data truncated for column ''name'' at row 1
Si quito la línea is_staff, todo está bien (¡excepto que no puedo hacer mi prueba!)
¿Tengo que cargar usuarios admin como fixtures?
UserProfile se define de la siguiente manera:
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)
y el error completo de seguimiento es:
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 respuesta parece ser que no puedes crear un usuario administrador en la configuración, pero puedes hacerlo en cualquier otra función, así que si quieres un usuario administrador en las pruebas, ¡usa un dispositivo!
Actualización 2
Ejecutó el fragmento para crear el superusuario desde un caso de prueba (subclase de django.test.TestCase
). Todo salió bien. También creó y guardó una instancia de UserProfile
con user = self.adminuser
. Eso también funcionó.
Actualizar
Esta línea es interesante:
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})
Parece que la ejecución falla al crear permisos.
Respuesta original
Advertencia: Datos truncados para la columna ''nombre'' en la fila 1
Extraño. Intenté esto desde el shell de Django y funcionó para mí. Estoy usando Postgresql 8.3 y Django 1.2.1 en Ubuntu Jaunty. ¿Puede dar más detalles sobre qué versión de Django / base de datos está usando?
Además, el User
no tiene un atributo de name
. ¿Puedes auth.User
verificar si estás usando auth.User
?
¿Tengo que cargar usuarios admin como fixtures?
Usted no tiene que hacerlo Pero si está creando este usuario administrador únicamente con fines de prueba, sería una buena idea agregar un accesorio. Eso es lo que hago en mis proyectos.