2010-08-26 13 views
6

Je suis en train de tester mon application et je rencontre un problème et je ne sais pas pourquoi. Je charge des appareils pour mes tests et les appareils ont des clés étrangères qui dépendent l'une de l'autre. Ils doivent être chargés dans un certain ordre ou cela ne fonctionnera pas.Est-ce que les appareils Django se chargent dans un ordre incorrect lors des tests?

Les accessoires que je suis chargement sont:

["test_company_data", "test_rate_index", 'test_rate_description']

données de l'entreprise est la première. test_rate_index a une clé étrangère à company, et test_rate_description a une clé étrangère à un modèle déclaré dans test_rate_index. Si vous utilisez la procédure standard de django pour charger les tests, les tests ne se chargent pas dans le bon ordre.

 
class TestPackages(test.TestCase): 
    fixtures = ["test_company_data", "test_rate_index", "test_rate_description",] 

je reçois le message

DoesNotExist: RateDescription matching query does not exist.

Mais si j'inverser l'ordre de mes appareils (qui n'a pas de sens) cela fonctionne:

fixtures = ["test_rate_description", "test_company_data", "test_rate_index",]

Django's documentation indique que les appareils se chargent dans l'ordre ils sont déclarés, mais cela ne semble pas être le cas.

Pour contourner ce problème, au lieu d'utiliser, je suis de django

 call_command('loaddata', *fixtures, **{ 
              'verbosity': 0, 
              'commit': False, 
              'database': 'default' 
             })

en utilisant une fonction différente dans la méthode de configuration qui charge les appareils un à la fois.

def load_fixtures(fixtures): 
    for fixture in fixtures: 
     call_command('loaddata', fixture, **{ 
              'verbosity': 0, 
              'commit': False, 
              'database': 'default' 
              })

Y at-il quelque chose que je fais mal ou ne pas comprendre qui est à l'origine de mes appareils ne doit pas être chargé dans l'ordre approprié lorsque vous essayez d'utiliser la méthode standard?

+0

pouvez-vous publier à quoi ressemblent les modèles de vos appareils? –

Répondre

1

La documentation de Django indique que les projecteurs se chargent dans l'ordre où ils sont déclarés, mais cela ne semble pas être le cas.

Ceci est certainement étrange. Les projecteurs sont chargés dans le bon ordre quand j'ai testé un de mes projets (Django 1.2.1, Python 2.6.2, Postgresql 8.3.11).

Voici ce que je ferais pour résoudre les problèmes.

DoesNotExist: La requête correspondant à RateDescription n'existe pas.

  1. Vous obtenez cette erreur lors du chargement d'un appareil ou lors de l'exécution d'un test? Pouvez-vous trouver le luminaire/code qui soulève ceci? Augmenter la verbosité si besoin est.

  2. Pouvez-vous essayer de déclencher une commande loaddata à partir de la ligne de commande? Appelez-le trois fois, en passant le nom d'un appareil pour chaque appel dans la bonne séquence attendue. Et voyez si les appareils sont chargés.

  3. Je sais que vous auriez probablement déjà fait cela, mais pouvez-vous vous assurer que les premiers et seconds appareils ne contiennent aucune donnée RateDescription?

+2

Salut Manoj, Merci pour vos suggestions de débogage. Lorsque j'ai couru de la ligne de commande, j'ai découvert que les appareils bombardaient parce que « CREATION_TIME » ne peut pas être nulle ». Après avoir ajouté le CREATION_TIME aux appareils qu'ils semblent fonctionner comme je l'attendre. Cependant, n'a toujours pas de sens pour moi pourquoi ils installeraient apparemment ok dans un ordre mais pas un autre.Tous mes tests passés et les tests reposent sur ces données étant là. – Aaron