2010-08-26 17 views
6

Sto testando la mia domanda e sto riscontrando un problema e non sono sicuro del perché. Sto caricando gli apparecchi per i miei test e gli apparecchi hanno chiavi esterne che dipendono l'una dall'altra. Devono essere caricati in un certo ordine o non funzionerà.Le partite di Django vengono caricate in ordine errato durante il test?

Gli apparecchi Sono carico sono:

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

dati Company è il primo. test_rate_index ha una chiave esterna per la società e test_rate_description ha una chiave esterna per un modello dichiarato in test_rate_index. (a parte, test diversi hanno bisogno di dispositivi diversi, motivo per cui non sto solo spingendo tutto in uno)

Se utilizzo la procedura standard di django per caricare i test, i test non vengono caricati nell'ordine corretto.

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

ottengo il messaggio

DoesNotExist: RateDescription matching query does not exist.

Ma se invertire l'ordine dei miei apparecchi (che non ha senso) funziona:

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

Django's documentation afferma che gli infissi caricano nell'ordine sono dichiarati, ma questo non sembra essere il caso.

Per risolvere il problema, invece di usare di

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

sto usando una funzione diversa nel metodo di configurazione che carica gli infissi una alla volta Django.

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

C'è qualcosa che sto facendo in modo errato o non capire che sta causando i miei apparecchi non deve essere caricato nel modo più corretto quando si tenta di utilizzare il metodo standard?

+0

puoi pubblicare i modelli dei tuoi apparecchi? –

risposta

1

La documentazione di Django indica che gli apparecchi vengono caricati nell'ordine in cui sono dichiarati, ma ciò non sembra essere il caso.

Questo è certamente strano. Le fixture vengono caricate nell'ordine corretto quando ho testato uno dei miei progetti (Django 1.2.1, Python 2.6.2, Postgresql 8.3.11).

Ecco cosa farei per la risoluzione dei problemi.

DoesNotExist: la query di corrispondenza RateDescription non esiste.

  1. State ottenendo questo errore durante il caricamento di un apparecchio o durante l'esecuzione di un test? Riesci a trovare il dispositivo/codice che sta sollevando questo? Aumentare la verbosità se necessario.

  2. Si può provare a lanciare un comando loaddata dalla riga di comando? Chiamalo tre volte, passando il nome di una fixture per ogni chiamata nella giusta sequenza prevista. E vedi se gli infissi vengono caricati.

  3. So che probabilmente lo avresti già fatto ma puoi assicurarti che il primo e il secondo dispositivo non contengano dati RateDescription?

+2

Ciao Manoj, grazie per i tuoi suggerimenti per il debug. Quando ho eseguito dalla riga di comando, ho scoperto che gli infissi bombardavano perché "CREATION_TIME" non può essere nullo". Dopo aver aggiunto il CREATION_TIME per gli infissi che sembrano funzionare come ci si aspetta. Tuttavia, non ha ancora senso per me perché installerebbero apparentemente ok in un ordine ma non in un altro. Tutti i miei test sono passati ei test si basano su quei dati che sono lì. – Aaron

Problemi correlati