tests unitaires Django avec des installations de chargement pour plusieurs problèmes d'applications dépendantes

StackOverflow https://stackoverflow.com/questions/2507294

Question

Je fais maintenant des tests unitaires pour le code déjà existant. Je fait face au problème suivant:

Après avoir exécuté syncdb pour créer la base de données de test, Django remplit automatiquement plusieurs tables comme django_content_type ou auth_permissions.

Alors, imaginez que je dois exécuter un test complexe, comme vérifier les utilisateurs d'enregistrement, qui aura besoin d'une tables de données de lof ot et les connexions entre eux.

Si je vais essayer d'utiliser toute ma base de données existante pour faire fixtures (ce serait plutôt convinient pour moi) - je recevrai l'erreur comme ici . Cela se produit parce que, Django a des tables déjà rempli comme django_content_type.

La prochaine possibilité consiste à utiliser l'option django dumpdata exclude pour déjà rempli de tables de syncdb. Mais cela ne fonctionne pas bien aussi, parce que si je prends l'utilisateur et les objets du groupe d'utilisateurs de mes permissions db et l'utilisateur table, qui a été automatiquement créé par syncdb, je peux recevoir des erreurs, parce que les clés primaires, qui les relient pointent maintenant mal. Ceci est mieux décrit en partie « enfer de fixation », mais la solution il montré doensn't bien paraître)

Le prochain schéma possible que je vois est le suivant:

  1. Je suis en cours d'exécution mes tests; Django crée la base de données de test, fait syncdb et crée toutes les tables.
  2. Dans ma configuration de test je tombe cette base de données, la création de la nouvelle base de données.
  3. Charger les données de vidage de base de données existante également dans la configuration de test
Était-ce utile?

La solution

Voilà comment le problème a été résolu:

Après la syncdb a créé la base de données de test, en partie setUp des tests que j'utilise os.system pour accéder shell de mon code. Ensuite, je charge juste la décharge de la base de données, que je veux utiliser pour les tests.

Cela fonctionne comme ceci: syncdb remplissages contenttype et d'autres tables avec des données. Puis, dans le cadre des tests setUp chargement de la décharge sql efface toutes les données créées précédemment et j'obtenir une base de données bien.

Peut-être pas la meilleure solution, mais il fonctionne =)

Autres conseils

Mon approche serait d'abord utiliser du Sud pour faire des migrations DB facile (ce qui ne permet pas du tout, mais il est agréable), puis utiliser un module de méthodes de création de modèles.

Lorsque vous exécutez

  $  manage.py test my_proj

Django avec le Sud installé avec créer le test DB et exécuter toutes vos migrations pour vous donner un db test complètement mis à jour.

Pour écrire des tests, créez d'abord un module python rue, test_model_factory.py Ici créer des fonctions qui créent vos objets.

def mk_user():
   User.objects.create(...)

Ensuite, dans vos tests que vous pouvez importer votre module test_model_factory, et créer des objets pour chaque test.

  def test_something(self):
     test_user = test_model_factory.mk_user()

     self.assert(test_user ...)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top