2016-08-05 1 views
-1

J'écris des tests unitaires pour une application Django REST Framework et j'utilise factory_boy pour créer mes faux tests. Je reçois l'erreur suivante lorsque j'exécute mon test:Django - La contrainte UNIQUE a échoué: auth_user.username

File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/loader.py", line 254, in _find_tests 
    module = self._get_module_from_name(name) 
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/loader.py", line 232, in _get_module_from_name 
    __import__(name) 
File "/Users/thomasheatwole/osf-meetings/meetings/conferences/tests.py", line 27, in <module> 
    class SubmissionFactory(factory.DjangoModelFactory): 
File "/Users/thomasheatwole/osf-meetings/meetings/conferences/tests.py", line 34, in SubmissionFactory 
    username = 'contributor' 
File "/Users/thomasheatwole/.virtualenvs/django/lib/python2.7/site-packages/factory/base.py", line 67, in __call__ 
    return cls.create(**kwargs) 
File "/Users/thomasheatwole/.virtualenvs/django/lib/python2.7/site-packages/factory/base.py", line 594, in create 
    return cls._generate(True, attrs) 
File "/Users/thomasheatwole/.virtualenvs/django/lib/python2.7/site-packages/factory/base.py", line 519, in _generate 
    obj = cls._prepare(create, **attrs) 
File "/Users/thomasheatwole/.virtualenvs/django/lib/python2.7/site-packages/factory/base.py", line 494, in _prepare 
    return cls._create(model_class, *args, **kwargs) 
File "/Users/thomasheatwole/.virtualenvs/django/lib/python2.7/site-packages/factory/django.py", line 181, in _create 
    return manager.create(*args, **kwargs) 
File "/Users/thomasheatwole/.virtualenvs/django/lib/python2.7/site-packages/django/db/models/manager.py", line 122, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
File "/Users/thomasheatwole/.virtualenvs/django/lib/python2.7/site-packages/django/db/models/query.py", line 401, in create 
    obj.save(force_insert=True, using=self.db) 
File "/Users/thomasheatwole/.virtualenvs/django/lib/python2.7/site-packages/django/contrib/auth/base_user.py", line 74, in save 
    super(AbstractBaseUser, self).save(*args, **kwargs) 
File "/Users/thomasheatwole/.virtualenvs/django/lib/python2.7/site-packages/django/db/models/base.py", line 708, in save 
    force_update=force_update, update_fields=update_fields) 
File "/Users/thomasheatwole/.virtualenvs/django/lib/python2.7/site-packages/django/db/models/base.py", line 736, in save_base 
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) 
File "/Users/thomasheatwole/.virtualenvs/django/lib/python2.7/site-packages/django/db/models/base.py", line 820, in _save_table 
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw) 
File "/Users/thomasheatwole/.virtualenvs/django/lib/python2.7/site-packages/django/db/models/base.py", line 859, in _do_insert 
    using=using, raw=raw) 
File "/Users/thomasheatwole/.virtualenvs/django/lib/python2.7/site-packages/django/db/models/manager.py", line 122, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
File "/Users/thomasheatwole/.virtualenvs/django/lib/python2.7/site-packages/django/db/models/query.py", line 1039, in _insert 
    return query.get_compiler(using=using).execute_sql(return_id) 
File "/Users/thomasheatwole/.virtualenvs/django/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 1060, in execute_sql 
    cursor.execute(sql, params) 
File "/Users/thomasheatwole/.virtualenvs/django/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
File "/Users/thomasheatwole/.virtualenvs/django/lib/python2.7/site-packages/django/db/utils.py", line 95, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
File "/Users/thomasheatwole/.virtualenvs/django/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
File "/Users/thomasheatwole/.virtualenvs/django/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 323, in execute 
    return Database.Cursor.execute(self, query, params) 
IntegrityError: UNIQUE constraint failed: auth_user.username 

Vous ne savez pas vraiment ce que cela signifie ou ce qui le cause. Voici où l'usine est définie:

class UserFactory(factory.DjangoModelFactory): 
    class Meta: 
     model = User 

est ici où une instance est créée:

contributor = UserFactory(
    username = 'contributor' 
    ) 

Voici le dossier complet: tests.py

Laissez-moi savoir s'il y a une solution facile. Merci!

Répondre

0

Il s'avère que j'appelais l'usine deux fois afin que les deux utilisateurs obtiennent username = 'contributor'. La solution simple est de ne pas définir le nom d'utilisateur à l'intérieur de l'usine mais de le définir lorsque vous appelez l'usine.

0

Comme indiqué dans votre réponse, le problème est que vous utilisez une valeur fixe pour un champ unique=True.

Une solution consiste à passer le username sur chaque appel à UserFactory; cependant, l'objectif de factory_boy est d'éviter d'avoir à spécifier de tels champs à moins que le test n'ait besoin d'une valeur spécifique.

Dans votre exemple, vous devez utiliser une définition inspirée de ce qui suit:

class UserFactory(factory.django.DjangoModelFactory): 
    class Meta: 
     model = models.User 

    username = factory.Faker('username') 

Avec cette définition, chaque appel à UserFactory fournira un User avec un autre nom d'utilisateur.

Et, si le username doit être défini pour un test spécifique, appelez simplement UserFactory(username='john').